From f180f63d94e9d54476c474449038149afd213650 Mon Sep 17 00:00:00 2001 From: jwellbelove Date: Thu, 16 Feb 2017 16:59:09 +0000 Subject: [PATCH 1/3] Added... has_trivial_constructor has_trivial_copy_constructor has_trivial_destructor has_trivial_assignment --- src/memory.h | 56 +++++++++++++++++++++++------------------------ src/type_traits.h | 22 ++++++++++++++++++- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/memory.h b/src/memory.h index 08a35217..69a3e3af 100644 --- a/src/memory.h +++ b/src/memory.h @@ -55,7 +55,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, T value) { std::fill(o_begin, o_end, value); @@ -68,7 +68,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, const T& value) { typedef typename std::iterator_traits::value_type value_type; @@ -88,7 +88,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, T value, TCounter& count) { std::fill(o_begin, o_end, value); @@ -103,7 +103,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, const T& value, TCounter& count) { count += std::distance(o_begin, o_end); @@ -147,7 +147,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin) { return std::copy(i_begin, i_end, o_begin); @@ -158,7 +158,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin) { typedef typename std::iterator_traits::value_type value_type; @@ -181,7 +181,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count) { TOutputIterator o_end = std::copy(i_begin, i_end, o_begin); @@ -196,7 +196,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TCounter& count) { typedef typename std::iterator_traits::value_type value_type; @@ -243,7 +243,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type uninitialized_default_construct(TOutputIterator /*o_begin*/, TOutputIterator /*o_end*/) { } @@ -253,7 +253,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type uninitialized_default_construct(TOutputIterator o_begin, TOutputIterator o_end) { typedef typename std::iterator_traits::value_type value_type; @@ -271,7 +271,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type uninitialized_default_construct(TOutputIterator o_begin, TOutputIterator o_end, TCounter& count) { count = std::distance(o_begin, o_end); @@ -283,7 +283,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type uninitialized_default_construct(TOutputIterator o_begin, TOutputIterator o_end, TCounter& count) { count += std::distance(o_begin, o_end); @@ -302,7 +302,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_default_construct_n(TOutputIterator o_begin, TSize n) { TOutputIterator o_end = o_begin + n; @@ -315,7 +315,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_default_construct_n(TOutputIterator o_begin, TSize n) { TOutputIterator o_end = o_begin + n; @@ -331,7 +331,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_default_construct_n(TOutputIterator o_begin, TSize n, TCounter& count) { TOutputIterator o_end = o_begin + n; @@ -347,7 +347,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TOutputIterator>::type + typename etl::enable_if::value_type>::value, TOutputIterator>::type uninitialized_default_construct_n(TOutputIterator o_begin, TSize n, TCounter& count) { TOutputIterator o_end = o_begin + n; @@ -430,7 +430,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value, void>::type + typename etl::enable_if::value, void>::type destroy_at(T* /*p*/) { } @@ -440,7 +440,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value, void>::type + typename etl::enable_if::value, void>::type destroy_at(T* p) { p->~T(); @@ -452,7 +452,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value, void>::type + typename etl::enable_if::value, void>::type destroy_at(T* /*p*/, TCounter& count) { --count; @@ -464,7 +464,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value, void>::type + typename etl::enable_if::value, void>::type destroy_at(T* p, TCounter& count) { p->~T(); @@ -476,7 +476,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type destroy(TIterator /*i_begin*/, TIterator /*i_end*/) { } @@ -486,7 +486,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type destroy(TIterator i_begin, TIterator i_end) { while (i_begin != i_end) @@ -502,7 +502,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type destroy(TIterator i_begin, TIterator i_end, TCounter& count) { count -= std::distance(i_begin, i_end); @@ -514,7 +514,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, void>::type + typename etl::enable_if::value_type>::value, void>::type destroy(TIterator i_begin, TIterator i_end, TCounter& count) { while (i_begin != i_end) @@ -530,7 +530,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TIterator>::type + typename etl::enable_if::value_type>::value, TIterator>::type destroy_n(TIterator i_begin, TSize n) { return i_begin + n; @@ -541,7 +541,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TIterator>::type + typename etl::enable_if::value_type>::value, TIterator>::type destroy_n(TIterator i_begin, TSize n) { while (n > 0) @@ -560,7 +560,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TIterator>::type + typename etl::enable_if::value_type>::value, TIterator>::type destroy_n(TIterator i_begin, TSize n, TCounter& count) { count -= n; @@ -573,7 +573,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - typename etl::enable_if::value_type>::value, TIterator>::type + typename etl::enable_if::value_type>::value, TIterator>::type destroy_n(TIterator i_begin, TSize n, TCounter& count) { count -= n; diff --git a/src/type_traits.h b/src/type_traits.h index 3602e6e9..8d08e219 100644 --- a/src/type_traits.h +++ b/src/type_traits.h @@ -233,11 +233,31 @@ namespace etl template struct is_reference : true_type {}; /// is_pod - /// For C++03 only fundamental and pointers types can be detected. + /// For C++03, only fundamental and pointers types are recognised. ///\ingroup type_traits template struct is_pod : etl::integral_constant::value || etl::is_pointer::value> {}; + /// has_trivial_constructor + /// For C++03, only POD types are recognised. + ///\ingroup type_traits + template struct has_trivial_constructor : etl::is_pod {}; + + /// has_trivial_copy_constructor + /// For C++03, only POD types are recognised. + ///\ingroup type_traits + template struct has_trivial_copy_constructor : etl::is_pod {}; + + /// has_trivial_destructor + /// For C++03, only POD types are recognised. + ///\ingroup type_traits + template struct has_trivial_destructor : etl::is_pod {}; + + /// has_trivial_assignment + /// For C++03, only POD types are recognised. + ///\ingroup type_traits + template struct has_trivial_assignment : etl::is_pod {}; + /// conditional ///\ingroup type_traits template struct conditional { typedef T type; }; From 9300b00646474f1a678d86b89634b4413d5dd260 Mon Sep 17 00:00:00 2001 From: jwellbelove Date: Fri, 17 Feb 2017 11:21:21 +0000 Subject: [PATCH 2/3] Added... uninitialized_default_construct uninitialized_value_construct for single items. --- src/memory.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 3 deletions(-) diff --git a/src/memory.h b/src/memory.h index 69a3e3af..2f8597f4 100644 --- a/src/memory.h +++ b/src/memory.h @@ -56,7 +56,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value_type>::value, TOutputIterator>::type - uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, T value) + uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, const T& value) { std::fill(o_begin, o_end, value); @@ -89,7 +89,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value_type>::value, TOutputIterator>::type - uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, T value, TCounter& count) + uninitialized_fill(TOutputIterator o_begin, TOutputIterator o_end, const T& value, TCounter& count) { std::fill(o_begin, o_end, value); count += std::distance(o_begin, o_end); @@ -238,6 +238,50 @@ namespace etl return etl::uninitialized_copy(i_begin, i_begin + n, o_begin); } + //***************************************************************************** + /// Default contruct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + typename etl::enable_if::value, void>::type + uninitialized_default_construct(T* /*p*/) + { + } + + //***************************************************************************** + /// Default contruct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + typename etl::enable_if::value, void>::type + uninitialized_default_construct(T* /*p*/, TCounter& count) + { + ++count; + } + + //***************************************************************************** + /// Default contruct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + typename etl::enable_if::value, void>::type + uninitialized_default_construct(T* p) + { + ::new (p) T; + } + + //***************************************************************************** + /// Default contruct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + typename etl::enable_if::value, void>::type + uninitialized_default_construct(T* p, TCounter& count) + { + ::new (p) T; + ++count; + } + //***************************************************************************** /// Default initialises a range of objects to uninitialised memory. ///\ingroup memory @@ -359,6 +403,48 @@ namespace etl return o_end; } + //***************************************************************************** + /// Value construct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + inline void uninitialized_value_construct(T* p) + { + ::new (p) T(); + } + + //***************************************************************************** + /// Value construct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + inline void uninitialized_value_construct(T* p, TCounter& count) + { + ::new (p) T(); + ++count; + } + + //***************************************************************************** + /// Copy construct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + inline void uninitialized_value_construct(T* p, const T& value) + { + ::new (p) T(value); + } + + //***************************************************************************** + /// Copy construct an item at address p. + ///\ingroup memory + //***************************************************************************** + template + inline void uninitialized_value_construct(T* p, const T& value, TCounter& count) + { + ::new (p) T(value); + ++count; + } + //***************************************************************************** /// Default initialises a range of objects to uninitialised memory. ///\ingroup memory @@ -521,8 +607,9 @@ namespace etl { etl::destroy_at(etl::addressof(*i_begin)); ++i_begin; - --count; } + + count -= std::distance(i_begin, i_end); } //***************************************************************************** From 2a4886b8d1396f2543b35c66c978d5d55597b507 Mon Sep 17 00:00:00 2001 From: jwellbelove Date: Fri, 17 Feb 2017 12:10:06 +0000 Subject: [PATCH 3/3] Renamed single item construct functions. --- src/memory.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/memory.h b/src/memory.h index 2f8597f4..bf6b5185 100644 --- a/src/memory.h +++ b/src/memory.h @@ -244,7 +244,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value, void>::type - uninitialized_default_construct(T* /*p*/) + construct_default_at(T* /*p*/) { } @@ -254,7 +254,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value, void>::type - uninitialized_default_construct(T* /*p*/, TCounter& count) + construct_default_at(T* /*p*/, TCounter& count) { ++count; } @@ -265,7 +265,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value, void>::type - uninitialized_default_construct(T* p) + construct_default_at(T* p) { ::new (p) T; } @@ -276,7 +276,7 @@ namespace etl //***************************************************************************** template typename etl::enable_if::value, void>::type - uninitialized_default_construct(T* p, TCounter& count) + construct_default_at(T* p, TCounter& count) { ::new (p) T; ++count; @@ -408,7 +408,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - inline void uninitialized_value_construct(T* p) + inline void construct_value_at(T* p) { ::new (p) T(); } @@ -418,7 +418,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - inline void uninitialized_value_construct(T* p, TCounter& count) + inline void construct_value_at(T* p, TCounter& count) { ::new (p) T(); ++count; @@ -429,7 +429,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - inline void uninitialized_value_construct(T* p, const T& value) + inline void construct_copy_at(T* p, const T& value) { ::new (p) T(value); } @@ -439,7 +439,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - inline void uninitialized_value_construct(T* p, const T& value, TCounter& count) + inline void construct_copy_at(T* p, const T& value, TCounter& count) { ::new (p) T(value); ++count;