|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r81749 - trunk/boost/smart_ptr/detail
From: glenfe_at_[hidden]
Date: 2012-12-06 22:10:23
Author: glenfe
Date: 2012-12-06 22:10:22 EST (Thu, 06 Dec 2012)
New Revision: 81749
URL: http://svn.boost.org/trac/boost/changeset/81749
Log:
Special case array construction for trivially default-constructible types and array destruction for trivially-destroyable types.
Text files modified:
trunk/boost/smart_ptr/detail/array_utility.hpp | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
Modified: trunk/boost/smart_ptr/detail/array_utility.hpp
==============================================================================
--- trunk/boost/smart_ptr/detail/array_utility.hpp (original)
+++ trunk/boost/smart_ptr/detail/array_utility.hpp 2012-12-06 22:10:22 EST (Thu, 06 Dec 2012)
@@ -17,12 +17,32 @@
namespace detail {
template<typename T>
inline void array_destroy(T* memory, std::size_t size) {
+ boost::has_trivial_destructor<T> type;
+ array_destroy(memory, size, type);
+ }
+ template<typename T>
+ inline void array_destroy(T*, std::size_t, boost::true_type) {
+ }
+ template<typename T>
+ inline void array_destroy(T* memory, std::size_t size, boost::false_type) {
for (std::size_t i = size; i > 0; ) {
memory[--i].~T();
}
}
template<typename T>
inline void array_construct(T* memory, std::size_t size) {
+ boost::has_trivial_default_constructor<T> type;
+ array_construct(memory, size, type);
+ }
+ template<typename T>
+ inline void array_construct(T* memory, std::size_t size, boost::true_type) {
+ for (std::size_t i = 0; i < size; i++) {
+ void* p1 = memory + i;
+ ::new(p1) T();
+ }
+ }
+ template<typename T>
+ inline void array_construct(T* memory, std::size_t size, boost::false_type) {
std::size_t i = 0;
try {
for (; i < size; i++) {
@@ -92,6 +112,14 @@
}
template<typename T>
inline void array_construct_noinit(T* memory, std::size_t size) {
+ boost::has_trivial_default_constructor<T> type;
+ array_construct_noinit(memory, size, type);
+ }
+ template<typename T>
+ inline void array_construct_noinit(T*, std::size_t, boost::true_type) {
+ }
+ template<typename T>
+ inline void array_construct_noinit(T* memory, std::size_t size, boost::false_type) {
std::size_t i = 0;
try {
for (; i < size; i++) {
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