Boost logo

Boost-Commit :

From: nielsdekker_at_[hidden]
Date: 2007-11-18 17:11:57


Author: niels_dekker
Date: 2007-11-18 17:11:57 EST (Sun, 18 Nov 2007)
New Revision: 41216
URL: http://svn.boost.org/trac/boost/changeset/41216

Log:
Code refactoring: removed private base classes of value_initialized, as suggested by Fernando Cacciola.
Text files modified:
   trunk/boost/utility/value_init.hpp | 107 +++++++++------------------------------
   1 files changed, 25 insertions(+), 82 deletions(-)

Modified: trunk/boost/utility/value_init.hpp
==============================================================================
--- trunk/boost/utility/value_init.hpp (original)
+++ trunk/boost/utility/value_init.hpp 2007-11-18 17:11:57 EST (Sun, 18 Nov 2007)
@@ -6,6 +6,7 @@
 //
 // 21 Ago 2002 (Created) Fernando Cacciola
 // 07 Set 2007 (Worked around MSVC++ bug) Fernando Cacciola, Niels Dekker
+// 16 Nov 2007 (Refactoring: removed private base classes) Fernando Cacciola, Niels Dekker
 //
 #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
 #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
@@ -14,7 +15,6 @@
 #include <boost/type_traits/cv_traits.hpp>
 #include <boost/detail/workaround.hpp>
 
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) )
 // Microsoft Visual C++ does not correctly support value initialization, as reported by
 // Pavel Kuznetsov (MetaCommunications Engineering), 7/28/2005, Feedback ID 100744,
 // Feedback Title: Value-initialization in new-expression
@@ -22,10 +22,12 @@
 // The report was closed at 11/14/2006, and its status was set to "Closed (Won't Fix)".
 // Luckily, even in the presence of this compiler bug, boost::value_initialized will still
 // do its job correctly, when using the following workaround:
-#define BOOST_UTILITY_VALUE_INIT_WORKAROUND
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))
+# define BOOST_UTILITY_VALUE_INIT_WORKAROUND
 #endif
 
 #ifdef BOOST_UTILITY_VALUE_INIT_WORKAROUND
+
 #include <boost/aligned_storage.hpp>
 #include <boost/type_traits/alignment_of.hpp>
 #include <cstring>
@@ -43,60 +45,34 @@
 
 namespace boost {
 
-namespace vinit_detail {
-
 template<class T>
-class const_T_base
+class value_initialized
 {
- protected :
-
- const_T_base()
- {
- std::memset(&x, 0, sizeof(x));
- new (&x) T();
- }
-
- ~const_T_base()
- {
- void const * ptr = &x;
- static_cast<T*>(ptr)->T::~T();
- }
-
- T & get() const
- {
- void const * ptr = &x;
- return *static_cast<T*>(ptr);
- }
-
   private :
- typename ::boost::aligned_storage<sizeof(T), ::boost::alignment_of<T>::value>::type x;
-} ;
+ mutable typename ::boost::aligned_storage<sizeof(T), ::boost::alignment_of<T>::value>::type x;
 
-template<class T>
-class non_const_T_base
-{
- protected :
+ public :
 
- non_const_T_base()
+ value_initialized()
     {
       std::memset(&x, 0, sizeof(x));
       new (&x) T();
     }
 
- ~non_const_T_base()
+ ~value_initialized()
     {
- void * ptr = &x;
- static_cast<T*>(ptr)->T::~T();
+ void * ptr = &x;
+ static_cast<T*>(ptr)->T::~T();
     }
 
- T & get() const
- {
+ T& data() const
+ {
       void * ptr = &x;
       return *static_cast<T*>(ptr);
     }
 
- private :
- mutable typename ::boost::aligned_storage<sizeof(T), ::boost::alignment_of<T>::value>::type x;
+ operator T&() const { return this->data(); }
+
 } ;
 
 #ifdef BOOST_MSVC
@@ -108,59 +84,27 @@
 
 namespace boost {
 
-namespace vinit_detail {
-
 template<class T>
-class const_T_base
+class value_initialized
 {
- protected :
-
- const_T_base() : x() {}
- T & get() const { return x; }
-
- private :
- T x ;
-} ;
+ public :
 
-template<class T>
-class non_const_T_base
-{
- protected :
+ value_initialized() : x() {}
 
- non_const_T_base() : x() {}
- T & get() const { return x; }
+ T& data() const { return x; }
 
- private :
- mutable T x ;
-} ;
+ operator T&() const { return this->data(); }
 
+ mutable
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+ typename
 #endif
+ ::boost::remove_const<T>::type x ;
 
-template<class T>
-struct select_base
-{
- typedef
-#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
- typename
-#endif
- ::boost::detail::if_true< ::boost::is_const<T>::value >
- ::template then< const_T_base<T>, non_const_T_base<T> >::type type ;
 } ;
+#endif
 
-} // namespace vinit_detail
-
-template<class T>
-class value_initialized : private vinit_detail::select_base<T>::type
-{
- public :
-
- value_initialized() {}
-
- operator T&() const { return this->get(); }
-
- T& data() const { return this->get(); }
 
-} ;
 
 template<class T>
 T const& get ( value_initialized<T> const& x )
@@ -177,4 +121,3 @@
 
 
 #endif
-


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk