Boost logo

Boost-Commit :

From: nielsdekker_at_[hidden]
Date: 2007-09-07 13:17:09


Author: nielsdekker
Date: 2007-09-07 13:17:09 EDT (Fri, 07 Sep 2007)
New Revision: 39157
URL: http://svn.boost.org/trac/boost/changeset/39157

Log:
Added MSVC workaround to value_initialized, as described by ticket #1217, proposed at the Boost Developers mailing list, and discussed with Fernando Cacciola.
Text files modified:
   trunk/boost/utility/value_init.hpp | 84 ++++++++++++++++++++++++++++++++++++++-
   1 files changed, 80 insertions(+), 4 deletions(-)

Modified: trunk/boost/utility/value_init.hpp
==============================================================================
--- trunk/boost/utility/value_init.hpp (original)
+++ trunk/boost/utility/value_init.hpp 2007-09-07 13:17:09 EDT (Fri, 07 Sep 2007)
@@ -1,10 +1,11 @@
-// (C) 2002, Fernando Luis Cacciola Carballal.
+// (C) Copyright 2002-2007, Fernando Luis Cacciola Carballal.
 //
 // 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)
 //
 // 21 Ago 2002 (Created) Fernando Cacciola
+// 07 Set 2007 (Worked around MSVC++ bug) Fernando Cacciola, Niels Dekker
 //
 #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
 #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
@@ -13,6 +14,75 @@
 #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
+// https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744
+// 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
+#endif
+
+#ifdef BOOST_UTILITY_VALUE_INIT_WORKAROUND
+#include <boost/aligned_storage.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+#include <cstring>
+#include <new>
+
+namespace boost {
+
+namespace vinit_detail {
+
+template<class T>
+class const_T_base
+{
+ protected :
+
+ const_T_base()
+ {
+ std::memset(&x, 0, sizeof(x));
+ new (&x) T();
+ }
+
+ ~const_T_base() { get().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;
+} ;
+
+template<class T>
+class non_const_T_base
+{
+ protected :
+
+ non_const_T_base()
+ {
+ std::memset(&x, 0, sizeof(x));
+ new (&x) T();
+ }
+
+ ~non_const_T_base() { get().T::~T(); }
+
+ T & get() const
+ {
+ void * ptr = &x;
+ return *static_cast<T*>(ptr);
+ }
+
+ private :
+ mutable typename ::boost::aligned_storage<sizeof(T), ::boost::alignment_of<T>::value>::type x;
+} ;
+
+#else
+
 namespace boost {
 
 namespace vinit_detail {
@@ -23,20 +93,26 @@
   protected :
 
    const_T_base() : x() {}
+ T & get() const { return x; }
 
+ private :
    T x ;
 } ;
 
 template<class T>
-struct non_const_T_base
+class non_const_T_base
 {
   protected :
 
    non_const_T_base() : x() {}
+ T & get() const { return x; }
 
+ private :
    mutable T x ;
 } ;
 
+#endif
+
 template<class T>
 struct select_base
 {
@@ -57,9 +133,9 @@
 
     value_initialized() {}
 
- operator T&() const { return this->x ; }
+ operator T&() const { return this->get(); }
 
- T& data() const { return this->x ; }
+ T& data() const { return this->get(); }
 
 } ;
 


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