Changeset 81749


Ignore:
Timestamp:
Dec 7, 2012, 3:10:22 AM (6 years ago)
Author:
Glen Fernandes
Message:

Special case array construction for trivially default-constructible types and array destruction for trivially-destroyable types.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/boost/smart_ptr/detail/array_utility.hpp

    r81748 r81749  
    1818        template<typename T>
    1919        inline void array_destroy(T* memory, std::size_t size) {
     20            boost::has_trivial_destructor<T> type;
     21            array_destroy(memory, size, type);
     22        }
     23        template<typename T>
     24        inline void array_destroy(T*, std::size_t, boost::true_type) {
     25        }
     26        template<typename T>
     27        inline void array_destroy(T* memory, std::size_t size, boost::false_type) {
    2028            for (std::size_t i = size; i > 0; ) {
    2129                memory[--i].~T();
     
    2432        template<typename T>
    2533        inline void array_construct(T* memory, std::size_t size) {
     34            boost::has_trivial_default_constructor<T> type;           
     35            array_construct(memory, size, type);
     36        }
     37        template<typename T>
     38        inline void array_construct(T* memory, std::size_t size, boost::true_type) {
     39            for (std::size_t i = 0; i < size; i++) {
     40                void* p1 = memory + i;
     41                ::new(p1) T();
     42            }
     43        }
     44        template<typename T>
     45        inline void array_construct(T* memory, std::size_t size, boost::false_type) {
    2646            std::size_t i = 0;
    2747            try {
     
    93113        template<typename T>
    94114        inline void array_construct_noinit(T* memory, std::size_t size) {
     115            boost::has_trivial_default_constructor<T> type;
     116            array_construct_noinit(memory, size, type);
     117        }
     118        template<typename T>
     119        inline void array_construct_noinit(T*, std::size_t, boost::true_type) {
     120        }
     121        template<typename T>
     122        inline void array_construct_noinit(T* memory, std::size_t size, boost::false_type) {
    95123            std::size_t i = 0;
    96124            try {
Note: See TracChangeset for help on using the changeset viewer.