|
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