|
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