From 53084ae932be0afb64c2ca6cef8f8dae220b23bf Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 25 Aug 2023 02:05:46 +0100 Subject: [PATCH] Added c++03 zero parameter emplace member functions --- .gitignore | 2 + include/etl/algorithm.h | 16 +- include/etl/deque.h | 34 +++ include/etl/flat_multiset.h | 29 +- include/etl/flat_set.h | 34 ++- include/etl/forward_list.h | 42 ++- include/etl/indirect_vector.h | 24 +- include/etl/list.h | 59 +++- include/etl/optional.h | 32 +++ include/etl/priority_queue.h | 16 ++ include/etl/private/ivectorpointer.h | 20 ++ include/etl/private/pvoidvector.h | 23 ++ include/etl/private/variant_legacy.h | 15 + include/etl/queue.h | 14 + include/etl/queue_lockable.h | 14 + include/etl/queue_mpmc_mutex.h | 33 +++ include/etl/queue_spsc_atomic.h | 22 ++ include/etl/queue_spsc_isr.h | 36 +++ include/etl/queue_spsc_locked.h | 35 +++ include/etl/stack.h | 14 + include/etl/vector.h | 16 ++ test/etl_profile.h | 4 + test/test_deque.cpp | 136 ++++++++- test/test_flat_multiset.cpp | 95 +++++-- test/test_flat_set.cpp | 72 ++++- test/test_indirect_vector.cpp | 47 +++- test/test_list.cpp | 107 +++++-- test/test_optional.cpp | 11 + test/test_priority_queue.cpp | 18 +- test/test_queue.cpp | 32 ++- test/test_queue_lockable.cpp | 4 +- test/test_queue_lockable_small.cpp | 9 +- test/test_queue_memory_model_small.cpp | 28 +- test/test_queue_mpmc_mutex.cpp | 7 +- test/test_queue_mpmc_mutex_small.cpp | 9 +- test/test_queue_spsc_atomic.cpp | 7 +- test/test_queue_spsc_atomic_small.cpp | 7 +- test/test_queue_spsc_isr.cpp | 23 +- test/test_queue_spsc_isr_small.cpp | 23 +- test/test_queue_spsc_locked.cpp | 23 +- test/test_queue_spsc_locked_small.cpp | 7 +- test/test_stack.cpp | 34 ++- test/test_vector.cpp | 88 ++++++ test/test_vector_non_trivial.cpp | 1 - test/test_vector_pointer.cpp | 46 +++ test/vs2022/etl.sln | 6 + test/vs2022/etl.vcxproj | 371 +++++++++++++++++++++++++ 47 files changed, 1564 insertions(+), 181 deletions(-) diff --git a/.gitignore b/.gitignore index 6800e824..1561cf00 100644 --- a/.gitignore +++ b/.gitignore @@ -384,3 +384,5 @@ test/vs2022/Debug MSVC C++ 20 - No Tests test/vs2022/enc_temp_folder test/vs2022/Debug MSVC C++20 - No virtual messages examples/MutexMessageRouter/.vs +support/time remaining test.xlsx +test/vs2022/Debug MSVC C++20 - Force C++03 diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index 29ddef18..d76ef87b 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -248,14 +248,7 @@ namespace etl template ETL_CONSTEXPR14 TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db) { - while (sb != se) - { - *db = *sb; - ++db; - ++sb; - } - - return db; + return copy(sb, se, db); } #endif @@ -284,12 +277,7 @@ namespace etl template ETL_CONSTEXPR14 TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de) { - while (sb != se) - { - *(--de) = *(--se); - } - - return de; + return etl::copy_backward(sb, se, de); } #endif diff --git a/include/etl/deque.h b/include/etl/deque.h index 3406ae00..f2daeda9 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -1757,6 +1757,23 @@ namespace etl #else + //************************************************************************* + /// Emplaces an item to the back of the deque. + /// If asserts or exceptions are enabled, throws an etl::deque_full if the deque is already full. + //************************************************************************* + reference emplace_back() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(deque_full)); +#endif + + ::new (&(*_end)) T(); + ++_end; + ++current_size; + ETL_INCREMENT_DEBUG_COUNT + return back(); + } + //************************************************************************* /// Emplaces an item to the back of the deque. /// If asserts or exceptions are enabled, throws an etl::deque_full if the deque is already full. @@ -1890,6 +1907,23 @@ namespace etl #else + //************************************************************************* + /// Emplaces an item to the front of the deque. + /// If asserts or exceptions are enabled, throws an etl::deque_full if the deque is already full. + //************************************************************************* + reference emplace_front() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(deque_full)); +#endif + + --_begin; + ::new (&(*_begin)) T(); + ++current_size; + ETL_INCREMENT_DEBUG_COUNT + return front(); + } + //************************************************************************* /// Emplaces an item to the front of the deque. /// If asserts or exceptions are enabled, throws an etl::deque_full if the deque is already full. diff --git a/include/etl/flat_multiset.h b/include/etl/flat_multiset.h index 2f35babe..8f6535fe 100644 --- a/include/etl/flat_multiset.h +++ b/include/etl/flat_multiset.h @@ -319,7 +319,7 @@ namespace etl //************************************************************************* /// Emplaces a value to the set. //************************************************************************* -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FLAT_MULTISET_FORCE_CPP03_IMPLEMENTATION) template ETL_OR_STD::pair emplace(Args && ... args) { @@ -332,9 +332,26 @@ namespace etl iterator i_element = upper_bound(*pvalue); ETL_INCREMENT_DEBUG_COUNT - return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); } #else + //************************************************************************* + /// Emplaces a value to the set. + //************************************************************************* + ETL_OR_STD::pair emplace() + { + ETL_ASSERT(!full(), ETL_ERROR(flat_multiset_full)); + + // Create it. + value_type* pvalue = storage.allocate(); + ::new (pvalue) value_type(); + + iterator i_element = upper_bound(*pvalue); + + ETL_INCREMENT_DEBUG_COUNT + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + } + //************************************************************************* /// Emplaces a value to the set. //************************************************************************* @@ -350,7 +367,7 @@ namespace etl iterator i_element = upper_bound(*pvalue); ETL_INCREMENT_DEBUG_COUNT - return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); } //************************************************************************* @@ -368,7 +385,7 @@ namespace etl iterator i_element = upper_bound(*pvalue); ETL_INCREMENT_DEBUG_COUNT - return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); } //************************************************************************* @@ -386,7 +403,7 @@ namespace etl iterator i_element = upper_bound(*pvalue); ETL_INCREMENT_DEBUG_COUNT - return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); } //************************************************************************* @@ -404,7 +421,7 @@ namespace etl iterator i_element = upper_bound(*pvalue); ETL_INCREMENT_DEBUG_COUNT - return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); + return ETL_OR_STD::pair(refset_t::insert_at(i_element, *pvalue)); } #endif diff --git a/include/etl/flat_set.h b/include/etl/flat_set.h index a0d839e2..98c5fbda 100644 --- a/include/etl/flat_set.h +++ b/include/etl/flat_set.h @@ -326,7 +326,7 @@ namespace etl //************************************************************************* /// Emplaces a value to the set. //************************************************************************* -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FLAT_SET_FORCE_CPP03_IMPLEMENTATION) template ETL_OR_STD::pair emplace(Args && ... args) { @@ -357,6 +357,38 @@ namespace etl return result; } #else + //************************************************************************* + /// Emplaces a value to the set. + //************************************************************************* + ETL_OR_STD::pair emplace() + { + ETL_ASSERT(!full(), ETL_ERROR(flat_set_full)); + + ETL_OR_STD::pair result; + + // Create it. + value_type* pvalue = storage.allocate(); + ::new (pvalue) value_type(); + + iterator i_element = lower_bound(*pvalue); + + // Doesn't already exist? + if ((i_element == end()) || compare(*pvalue, *i_element)) + { + ETL_INCREMENT_DEBUG_COUNT + result = refset_t::insert_at(i_element, *pvalue); + } + else + { + // Destroy it. + pvalue->~value_type(); + storage.release(pvalue); + result = ETL_OR_STD::pair(end(), false); + } + + return result; + } + //************************************************************************* /// Emplaces a value to the set. //************************************************************************* diff --git a/include/etl/forward_list.h b/include/etl/forward_list.h index c149ada3..39e69de8 100644 --- a/include/etl/forward_list.h +++ b/include/etl/forward_list.h @@ -717,7 +717,7 @@ namespace etl } #endif -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FORWARD_LIST_FORCE_CPP03_IMPLEMENTATION) //************************************************************************* /// Emplaces a value to the front of the list.. //************************************************************************* @@ -734,6 +734,21 @@ namespace etl return front(); } #else + //************************************************************************* + /// Emplaces a value to the front of the list.. + //************************************************************************* + reference emplace_front() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(forward_list_full)); +#endif + data_node_t* p_data_node = allocate_data_node(); + ::new (&(p_data_node->value)) T(); + ETL_INCREMENT_DEBUG_COUNT + insert_node_after(start_node, *p_data_node); + return front(); + } + //************************************************************************* /// Emplaces a value to the front of the list.. //************************************************************************* @@ -879,7 +894,7 @@ namespace etl return iterator(&data_node); } -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FORWARD_LIST_FORCE_CPP03_IMPLEMENTATION) //************************************************************************* /// Emplaces a value to the forward_list after the specified position. //************************************************************************* @@ -896,6 +911,21 @@ namespace etl return iterator(p_data_node); } #else + //************************************************************************* + /// Emplaces a value to the forward_list after the specified position. + //************************************************************************* + iterator emplace_after(const_iterator position) + { + ETL_ASSERT(!full(), ETL_ERROR(forward_list_full)); + + data_node_t* p_data_node = allocate_data_node(); + ::new (&(p_data_node->value)) T(); + ETL_INCREMENT_DEBUG_COUNT + insert_node_after(*to_iterator(position).p_node, *p_data_node); + + return iterator(p_data_node); + } + //************************************************************************* /// Emplaces a value to the forward_list after the specified position. //************************************************************************* @@ -907,7 +937,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1); ETL_INCREMENT_DEBUG_COUNT - insert_node_after(*position.p_node, *p_data_node); + insert_node_after(*to_iterator(position).p_node, *p_data_node); return iterator(p_data_node); } @@ -923,7 +953,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2); ETL_INCREMENT_DEBUG_COUNT - insert_node_after(*position.p_node, *p_data_node); + insert_node_after(*to_iterator(position).p_node, *p_data_node); return iterator(p_data_node); } @@ -939,7 +969,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2, value3); ETL_INCREMENT_DEBUG_COUNT - insert_node_after(*position.p_node, *p_data_node); + insert_node_after(*to_iterator(position).p_node, *p_data_node); return iterator(p_data_node); } @@ -955,7 +985,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2, value3, value4); ETL_INCREMENT_DEBUG_COUNT - insert_node_after(*position.p_node, *p_data_node); + insert_node_after(*to_iterator(position).p_node, *p_data_node); return iterator(p_data_node); } diff --git a/include/etl/indirect_vector.h b/include/etl/indirect_vector.h index 7158a4a0..60542784 100644 --- a/include/etl/indirect_vector.h +++ b/include/etl/indirect_vector.h @@ -789,6 +789,18 @@ namespace etl return back(); } #else + //********************************************************************* + /// Constructs a value at the end of the indirect_vector. + /// If asserts or exceptions are enabled, emits vector_full if the indirect_vector is already full. + ///\param value The value to add. + //********************************************************************* + reference emplace_back() + { + T* p = storage.create(T()); + lookup.push_back(p); + return back(); + } + //********************************************************************* /// Constructs a value at the end of the indirect_vector. /// If asserts or exceptions are enabled, emits vector_full if the indirect_vector is already full. @@ -891,7 +903,7 @@ namespace etl //************************************************************************* /// Emplaces a value to the vector at the specified position. //************************************************************************* -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION) template iterator emplace(iterator position, Args && ... args) { @@ -903,6 +915,16 @@ namespace etl return position; } #else + iterator emplace(iterator position) + { + ETL_ASSERT(!full(), ETL_ERROR(vector_full)); + + T* p = storage.create(T()); + position = iterator(lookup.insert(position.lookup_itr, p)); + + return position; + } + template iterator emplace(iterator position, const T1& value1) { diff --git a/include/etl/list.h b/include/etl/list.h index c3d0e045..6734a10e 100644 --- a/include/etl/list.h +++ b/include/etl/list.h @@ -857,7 +857,7 @@ namespace etl } #endif -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_LIST_FORCE_CPP03_IMPLEMENTATION) //************************************************************************* /// Emplaces a value to the front of the list. //************************************************************************* @@ -876,6 +876,23 @@ namespace etl return front(); } #else + //************************************************************************* + /// Emplaces a value to the front of the list. + //************************************************************************* + reference emplace_front() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(list_full)); +#endif + ETL_ASSERT(p_node_pool != ETL_NULLPTR, ETL_ERROR(list_no_pool)); + + data_node_t* p_data_node = allocate_data_node(); + ::new (&(p_data_node->value)) T(); + ETL_INCREMENT_DEBUG_COUNT + insert_node(get_head(), *p_data_node); + return front(); + } + //************************************************************************* /// Emplaces a value to the front of the list. //************************************************************************* @@ -1004,6 +1021,20 @@ namespace etl return back(); } #else + reference emplace_back() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(list_full)); +#endif + ETL_ASSERT(p_node_pool != ETL_NULLPTR, ETL_ERROR(list_no_pool)); + + data_node_t* p_data_node = allocate_data_node(); + ::new (&(p_data_node->value)) T(); + ETL_INCREMENT_DEBUG_COUNT + insert_node(terminal_node, *p_data_node); + return back(); + } + template reference emplace_back(const T1& value1) { @@ -1108,9 +1139,9 @@ namespace etl //************************************************************************* /// Emplaces a value to the list at the specified position. //************************************************************************* -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT +#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_LIST_FORCE_CPP03_IMPLEMENTATION) template - iterator emplace(const_iterator position, Args && ... args) + iterator emplace(const_iterator position, Args&& ... args) { ETL_ASSERT(!full(), ETL_ERROR(list_full)); ETL_ASSERT(p_node_pool != ETL_NULLPTR, ETL_ERROR(list_no_pool)); @@ -1123,6 +1154,19 @@ namespace etl return iterator(*p_data_node); } #else + iterator emplace(const_iterator position) + { + ETL_ASSERT(!full(), ETL_ERROR(list_full)); + ETL_ASSERT(p_node_pool != ETL_NULLPTR, ETL_ERROR(list_no_pool)); + + data_node_t* p_data_node = allocate_data_node(); + ::new (&(p_data_node->value)) T(); + ETL_INCREMENT_DEBUG_COUNT + insert_node(*to_iterator(position).p_node, *p_data_node); + + return iterator(*p_data_node); + } + template iterator emplace(const_iterator position, const T1& value1) { @@ -1132,7 +1176,8 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1); ETL_INCREMENT_DEBUG_COUNT - insert_node(*position.p_node, *p_data_node); + iterator(*p_data_node).p_node; + insert_node(*to_iterator(position).p_node, *p_data_node); return iterator(*p_data_node); } @@ -1146,7 +1191,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2); ETL_INCREMENT_DEBUG_COUNT - insert_node(*position.p_node, *p_data_node); + insert_node(*to_iterator(position).p_node, *p_data_node); return iterator(*p_data_node); } @@ -1160,7 +1205,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2, value3); ETL_INCREMENT_DEBUG_COUNT - insert_node(*position.p_node, *p_data_node); + insert_node(*to_iterator(position).p_node, *p_data_node); return iterator(*p_data_node); } @@ -1174,7 +1219,7 @@ namespace etl data_node_t* p_data_node = allocate_data_node(); ::new (&(p_data_node->value)) T(value1, value2, value3, value4); ETL_INCREMENT_DEBUG_COUNT - insert_node(*position.p_node, *p_data_node); + insert_node(*to_iterator(position).p_node, *p_data_node); return iterator(*p_data_node); } diff --git a/include/etl/optional.h b/include/etl/optional.h index 7f20e05f..a6d7a15c 100644 --- a/include/etl/optional.h +++ b/include/etl/optional.h @@ -115,6 +115,8 @@ namespace etl { public: + typedef T value_type; + //*************************************************************************** /// Constructor. //*************************************************************************** @@ -487,6 +489,24 @@ namespace etl storage.construct(etl::forward(args)...); } #else + //************************************************************************* + /// Emplaces a value. + /// 1 parameter. + //************************************************************************* + T& emplace() + { + if (has_value()) + { + // Destroy the old one. + storage.destroy(); + } + + T* p = ::new (&storage.u.value) T(); + storage.valid = true; + + return *p; + } + //************************************************************************* /// Emplaces a value. /// 1 parameter. @@ -670,6 +690,8 @@ namespace etl { public: + typedef T value_type; + //*************************************************************************** /// Constructor. //*************************************************************************** @@ -1006,6 +1028,16 @@ namespace etl valid = true; } #else + //************************************************************************* + /// Emplaces a value. + /// 0 parameters. + //************************************************************************* + void emplace() + { + storage.u.value = value_type(); + valid = true; + } + //************************************************************************* /// Emplaces a value. /// 1 parameter. diff --git a/include/etl/priority_queue.h b/include/etl/priority_queue.h index d4222090..ede0516b 100644 --- a/include/etl/priority_queue.h +++ b/include/etl/priority_queue.h @@ -197,6 +197,22 @@ namespace etl etl::push_heap(container.begin(), container.end(), compare); } #else + //************************************************************************* + /// Emplaces a value to the queue. + /// If asserts or exceptions are enabled, throws an etl::priority_queue_full + /// is the priority queue is already full. + ///\param value The value to push to the queue. + //************************************************************************* + void emplace() + { + ETL_ASSERT(!full(), ETL_ERROR(etl::priority_queue_full)); + + // Put element at end + container.emplace_back(); + // Make elements in container into heap + etl::push_heap(container.begin(), container.end(), compare); + } + //************************************************************************* /// Emplaces a value to the queue. /// If asserts or exceptions are enabled, throws an etl::priority_queue_full diff --git a/include/etl/private/ivectorpointer.h b/include/etl/private/ivectorpointer.h index ac1e0746..52b9924c 100644 --- a/include/etl/private/ivectorpointer.h +++ b/include/etl/private/ivectorpointer.h @@ -349,6 +349,18 @@ namespace etl base_t::push_back(value); } + //********************************************************************* + /// Constructs a value at the end of the vector. + /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. + ///\param value The value to add. + //********************************************************************* + reference emplace_back() + { + base_t::emplace_back(ETL_NULLPTR); + + return back(); + } + //********************************************************************* /// Constructs a value at the end of the vector. /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. @@ -381,6 +393,14 @@ namespace etl return iterator(base_t::insert(base_t::iterator(position), value)); } + //************************************************************************* + /// Emplaces a value to the vector at the specified position. + //************************************************************************* + iterator emplace(const_iterator position) + { + return iterator(base_t::emplace(base_t::iterator(position), ETL_NULLPTR)); + } + //************************************************************************* /// Emplaces a value to the vector at the specified position. //************************************************************************* diff --git a/include/etl/private/pvoidvector.h b/include/etl/private/pvoidvector.h index 0561082e..6ec32092 100644 --- a/include/etl/private/pvoidvector.h +++ b/include/etl/private/pvoidvector.h @@ -462,6 +462,29 @@ namespace etl return position_; } + //************************************************************************* + /// Emplaces a value to the vector at the specified position. + /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. + //************************************************************************* + iterator emplace(const_iterator position) + { + ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); + + iterator position_ = to_iterator(position); + + if (position_ != end()) + { + ++p_end; + etl::copy_backward(position_, end() - 1, end()); + *position_ = ETL_NULLPTR; + } + else + { + *p_end++ = ETL_NULLPTR; + } + + return position_; + } //************************************************************************* /// Emplaces a value to the vector at the specified position. diff --git a/include/etl/private/variant_legacy.h b/include/etl/private/variant_legacy.h index 1743558e..93878ce5 100644 --- a/include/etl/private/variant_legacy.h +++ b/include/etl/private/variant_legacy.h @@ -520,6 +520,21 @@ namespace etl return *static_cast(data); } #else + //*************************************************************************** + /// Emplace with one constructor parameter. + //*************************************************************************** + template + T& emplace() + { + ETL_STATIC_ASSERT(Type_Is_Supported::value, "Unsupported type"); + + destruct_current(); + ::new (static_cast(data)) T(); + type_id = Type_Id_Lookup::type_id; + + return *static_cast(data); + } + //*************************************************************************** /// Emplace with one constructor parameter. //*************************************************************************** diff --git a/include/etl/queue.h b/include/etl/queue.h index b3521f39..e7d94a7a 100644 --- a/include/etl/queue.h +++ b/include/etl/queue.h @@ -349,6 +349,20 @@ namespace etl add_in(); } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + ///\param value The value to use to construct the item to push to the queue. + //************************************************************************* + void emplace() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(queue_full)); +#endif + ::new (&p_buffer[in]) T(); + add_in(); + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. diff --git a/include/etl/queue_lockable.h b/include/etl/queue_lockable.h index f8a325b4..21841adc 100644 --- a/include/etl/queue_lockable.h +++ b/include/etl/queue_lockable.h @@ -369,6 +369,20 @@ namespace etl return emplace_implementation(value1, value2, value3, value4); } + //************************************************************************* + /// Constructs a value in the queue 'in place'. + //************************************************************************* + bool emplace() + { + this->lock(); + + bool result = emplace_implementation(); + + this->unlock(); + + return result; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. //************************************************************************* diff --git a/include/etl/queue_mpmc_mutex.h b/include/etl/queue_mpmc_mutex.h index 8c46df6b..6e80d14f 100644 --- a/include/etl/queue_mpmc_mutex.h +++ b/include/etl/queue_mpmc_mutex.h @@ -199,6 +199,21 @@ namespace etl return result; } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + //************************************************************************* + bool emplace() + { + access.lock(); + + bool result = emplace_implementation(); + + access.unlock(); + + return result; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. @@ -470,6 +485,24 @@ namespace etl #else //************************************************************************* /// Constructs a value in the queue 'in place'. + //************************************************************************* + bool emplace_implementation() + { + if (current_size != MAX_SIZE) + { + ::new (&p_buffer[write_index]) T(); + + write_index = get_next_index(write_index, MAX_SIZE); + + ++current_size; + + return true; + } + + // Queue is full. + return false; + } + //************************************************************************* template bool emplace_implementation(const T1& value1) diff --git a/include/etl/queue_spsc_atomic.h b/include/etl/queue_spsc_atomic.h index b19e2aac..d06dce2d 100644 --- a/include/etl/queue_spsc_atomic.h +++ b/include/etl/queue_spsc_atomic.h @@ -272,6 +272,28 @@ namespace etl return false; } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + //************************************************************************* + bool emplace() + { + size_type write_index = write.load(etl::memory_order_relaxed); + size_type next_index = get_next_index(write_index, RESERVED); + + if (next_index != read.load(etl::memory_order_acquire)) + { + ::new (&p_buffer[write_index]) T(); + + write.store(next_index, etl::memory_order_release); + + return true; + } + + // Queue is full. + return false; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. diff --git a/include/etl/queue_spsc_isr.h b/include/etl/queue_spsc_isr.h index eeb7d155..0e9be3f1 100644 --- a/include/etl/queue_spsc_isr.h +++ b/include/etl/queue_spsc_isr.h @@ -262,6 +262,27 @@ namespace etl return false; } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + //************************************************************************* + bool emplace_implementation() + { + if (current_size != MAX_SIZE) + { + ::new (&p_buffer[write_index]) T(); + + write_index = get_next_index(write_index, MAX_SIZE); + + ++current_size; + + return true; + } + + // Queue is full. + return false; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. @@ -528,6 +549,21 @@ namespace etl return result; } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + //************************************************************************* + bool emplace() + { + TAccess::lock(); + + bool result = this->emplace_implementation(); + + TAccess::unlock(); + + return result; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. diff --git a/include/etl/queue_spsc_locked.h b/include/etl/queue_spsc_locked.h index 3495b2f4..a5e7ca1f 100644 --- a/include/etl/queue_spsc_locked.h +++ b/include/etl/queue_spsc_locked.h @@ -320,6 +320,21 @@ namespace etl return emplace_implementation(value1, value2, value3, value4); } + //************************************************************************* + /// Constructs a value in the queue 'in place'. + /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. + //************************************************************************* + bool emplace() + { + lock(); + + bool result = emplace_implementation(); + + unlock(); + + return result; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. /// If asserts or exceptions are enabled, throws an etl::queue_full if the queue if already full. @@ -640,6 +655,26 @@ namespace etl return false; } #else + //************************************************************************* + /// Constructs a value in the queue 'in place'. + //************************************************************************* + bool emplace_implementation() + { + if (this->current_size != this->MAX_SIZE) + { + ::new (&p_buffer[this->write_index]) T(); + + this->write_index = this->get_next_index(this->write_index, this->MAX_SIZE); + + ++this->current_size; + + return true; + } + + // Queue is full. + return false; + } + //************************************************************************* /// Constructs a value in the queue 'in place'. //************************************************************************* diff --git a/include/etl/stack.h b/include/etl/stack.h index cea00443..ed28c4c8 100644 --- a/include/etl/stack.h +++ b/include/etl/stack.h @@ -292,6 +292,20 @@ namespace etl ::new (&p_buffer[top_index]) T(etl::forward(args)...); } #else + //************************************************************************* + /// Constructs a value in the stack place'. + /// If asserts or exceptions are enabled, throws an etl::stack_full if the stack is already full. + ///\param value The value to push to the stack. + //************************************************************************* + void emplace() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(!full(), ETL_ERROR(stack_full)); +#endif + base_t::add_in(); + ::new (&p_buffer[top_index]) T(); + } + //************************************************************************* /// Constructs a value in the stack place'. /// If asserts or exceptions are enabled, throws an etl::stack_full if the stack is already full. diff --git a/include/etl/vector.h b/include/etl/vector.h index bada15ba..0bf99f20 100644 --- a/include/etl/vector.h +++ b/include/etl/vector.h @@ -470,6 +470,22 @@ namespace etl return back(); } #else + //********************************************************************* + /// Constructs a value at the end of the vector. + /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. + ///\param value The value to add. + //********************************************************************* + reference emplace_back() + { +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); +#endif + ::new (p_end) T(); + ++p_end; + ETL_INCREMENT_DEBUG_COUNT + return back(); + } + //********************************************************************* /// Constructs a value at the end of the vector. /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. diff --git a/test/etl_profile.h b/test/etl_profile.h index 9ac74013..c7240422 100644 --- a/test/etl_profile.h +++ b/test/etl_profile.h @@ -98,6 +98,10 @@ SOFTWARE. #define ETL_DELEGATE_FORCE_CPP03_IMPLEMENTATION #define ETL_SINGLETON_FORCE_CPP03_IMPLEMENTATION #define ETL_BYTE_FORCE_CPP03_IMPLEMENTATION + #define ETL_LIST_FORCE_CPP03_IMPLEMENTATION + #define ETL_FORWARD_LIST_FORCE_CPP03_IMPLEMENTATION + #define ETL_FLAT_SET_FORCE_CPP03_IMPLEMENTATION + #define ETL_FLAT_MULTISET_FORCE_CPP03_IMPLEMENTATION #endif #if defined(ETL_FORCE_TEST_CPP11) diff --git a/test/test_deque.cpp b/test/test_deque.cpp index 7d58f9fd..5660bb02 100644 --- a/test/test_deque.cpp +++ b/test/test_deque.cpp @@ -934,7 +934,7 @@ namespace DataNDC data(compare_data.begin(), compare_data.end()); Compare_Data::iterator cposition = compare_data.insert(compare_data.cbegin() + 3, N14); - DataNDC::iterator position = data.insert(data.cbegin() + 3, N14); + DataNDC::iterator position = data.insert(data.cbegin() + 3, N14); CHECK_EQUAL(compare_data.size(), std::distance(data.begin(), data.end())); CHECK_EQUAL(compare_data.size(), data.size()); @@ -960,7 +960,7 @@ namespace DataNDC data(compare_data.begin(), compare_data.end()); Compare_Data::iterator cposition = compare_data.emplace(compare_data.begin() + 3, N14.value); - DataNDC::iterator position = data.emplace(data.begin() + 3, N14.value); + DataNDC::iterator position = data.emplace(data.begin() + 3, N14.value); CHECK_EQUAL(compare_data.size(), std::distance(data.begin(), data.end())); CHECK_EQUAL(compare_data.size(), data.size()); @@ -979,6 +979,138 @@ namespace CHECK_EQUAL(std::distance(compare_data.begin(), cposition), std::distance(data.begin(), position)); } + //************************************************************************* + TEST(test_emplace_default) + { + const int Initial = 1; + const int Default = 2; + + struct S + { + S() + : value(Default) + { + } + + S(int v) + : value(v) + { + } + + bool operator ==(const S& rhs) const + { + return value == rhs.value; + } + + int value; + }; + + // First fill with Initial values. + etl::deque data; + data.resize(SIZE, S(Initial)); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace(data.end()); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(S()); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + + //************************************************************************* + TEST(test_emplace_front_default) + { + const int Initial = 1; + const int Default = 2; + + struct S + { + S() + : value(Default) + { + } + + S(int v) + : value(v) + { + } + + bool operator ==(const S& rhs) const + { + return value == rhs.value; + } + + int value; + }; + + // First fill with Initial values. + etl::deque data; + data.resize(SIZE, S(Initial)); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace_front(); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(S()); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + + //************************************************************************* + TEST(test_emplace_back_default) + { + const int Initial = 1; + const int Default = 2; + + struct S + { + S() + : value(Default) + { + } + + S(int v) + : value(v) + { + } + + bool operator ==(const S& rhs) const + { + return value == rhs.value; + } + + int value; + }; + + // First fill with Initial values. + etl::deque data; + data.resize(SIZE, S(Initial)); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace_back(); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(S()); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + //************************************************************************* TEST(test_insert_n_value_position) { diff --git a/test/test_flat_multiset.cpp b/test/test_flat_multiset.cpp index fbeba5c1..03e284af 100644 --- a/test/test_flat_multiset.cpp +++ b/test/test_flat_multiset.cpp @@ -62,6 +62,11 @@ namespace struct D1 { + D1() + : a("a") + { + } + D1(const std::string& a_) : a(a_) { @@ -72,9 +77,15 @@ namespace struct D2 { + D2() + : a("a") + , b("b") + { + } + D2(const std::string& a_, const std::string& b_) - : a(a_), - b(b_) + : a(a_) + , b(b_) { } @@ -84,10 +95,17 @@ namespace struct D3 { + D3() + : a("a") + , b("b") + , c("c") + { + } + D3(const std::string& a_, const std::string& b_, const std::string& c_) - : a(a_), - b(b_), - c(c_) + : a(a_) + , b(b_) + , c(c_) { } @@ -98,11 +116,19 @@ namespace struct D4 { + D4() + : a("a") + , b("b") + , c("c") + , d("d") + { + } + D4(const std::string& a_, const std::string& b_, const std::string& c_, const std::string& d_) - : a(a_), - b(b_), - c(c_), - d(d_) + : a(a_) + , b(b_) + , c(c_) + , d(d_) { } @@ -582,6 +608,37 @@ namespace CHECK(std::is_sorted(data.begin(), data.end())); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_emplace_default_value) + { + Compare1 compare; + Data1 data; + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + // Do it again. + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + CHECK_EQUAL(compare.size(), data.size()); + + bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); + CHECK(isEqual); + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_value1) { @@ -609,10 +666,7 @@ namespace CHECK_EQUAL(compare.size(), data.size()); - bool isEqual = std::equal(data.begin(), - data.end(), - compare.begin()); - + bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } @@ -643,10 +697,7 @@ namespace CHECK_EQUAL(compare.size(), data.size()); - bool isEqual = std::equal(data.begin(), - data.end(), - compare.begin()); - + bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } @@ -677,10 +728,7 @@ namespace CHECK_EQUAL(compare.size(), data.size()); - bool isEqual = std::equal(data.begin(), - data.end(), - compare.begin()); - + bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } @@ -711,10 +759,7 @@ namespace CHECK_EQUAL(compare.size(), data.size()); - bool isEqual = std::equal(data.begin(), - data.end(), - compare.begin()); - + bool isEqual = std::equal(data.begin(), data.end(), compare.begin()); CHECK(isEqual); } diff --git a/test/test_flat_set.cpp b/test/test_flat_set.cpp index 931972e2..19e6d039 100644 --- a/test/test_flat_set.cpp +++ b/test/test_flat_set.cpp @@ -94,6 +94,11 @@ namespace struct D1 { + D1() + : a("a") + { + } + D1(const std::string& a_) : a(a_) { @@ -104,9 +109,15 @@ namespace struct D2 { + D2() + : a("a") + , b("b") + { + } + D2(const std::string& a_, const std::string& b_) - : a(a_), - b(b_) + : a(a_) + , b(b_) { } @@ -116,10 +127,17 @@ namespace struct D3 { + D3() + : a("a") + , b("b") + , c("c") + { + } + D3(const std::string& a_, const std::string& b_, const std::string& c_) - : a(a_), - b(b_), - c(c_) + : a(a_) + , b(b_) + , c(c_) { } @@ -130,11 +148,19 @@ namespace struct D4 { + D4() + : a("a") + , b("b") + , c("c") + , d("d") + { + } + D4(const std::string& a_, const std::string& b_, const std::string& c_, const std::string& d_) - : a(a_), - b(b_), - c(c_), - d(d_) + : a(a_) + , b(b_) + , c(c_) + , d(d_) { } @@ -587,6 +613,34 @@ namespace CHECK(std::is_sorted(data.begin(), data.end())); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_emplace_default_value) + { + Compare1 compare; + Data1 data; + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + // Do it again. + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + data.emplace(); + compare.emplace(); + + CHECK_EQUAL(compare.size(), data.size()); + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_value1) { diff --git a/test/test_indirect_vector.cpp b/test/test_indirect_vector.cpp index 97dc944f..2e3256b0 100644 --- a/test/test_indirect_vector.cpp +++ b/test/test_indirect_vector.cpp @@ -692,6 +692,27 @@ namespace CHECK_THROW(data.push_back(NDC("Z")), etl::vector_full); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_emplace_back_default_value) + { + CompareDataDC compare_data; + DataDC data; + + for (size_t i = 0UL; i < SIZE; ++i) + { + compare_data.emplace_back(); + data.emplace_back(); + } + + CHECK_EQUAL(compare_data.size(), data.size()); + + bool is_equal = std::equal(data.begin(), + data.end(), + compare_data.begin()); + + CHECK(is_equal); + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_back) { @@ -802,7 +823,6 @@ namespace } //************************************************************************* - // To test the CPP03 versions then ETL_TEST_VECTOR_CPP11 must be set to 0 in vector.h TEST_FIXTURE(SetupFixture, test_emplace_back_multiple) { class Data @@ -965,6 +985,31 @@ namespace } } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_emplace_position_default_value) + { + const size_t INITIAL_SIZE = 5UL; + + for (size_t offset = 0UL; offset <= INITIAL_SIZE; ++offset) + { + CompareDataDC compare_data; + DataDC data; + + DC initial[] = { DC("0"), DC("1"), DC("2"), DC("3"), DC("4"), DC("4"), DC("4"), DC("5"), DC("6"), DC("7"), DC("8"), DC("9") }; + + data.assign(std::begin(initial), std::begin(initial) + INITIAL_SIZE); + compare_data.assign(std::begin(initial), std::begin(initial) + INITIAL_SIZE); + + data.emplace(data.begin() + offset); + compare_data.emplace(compare_data.begin() + offset); + + CHECK_EQUAL(compare_data.size(), data.size()); + + bool is_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + CHECK(is_equal); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_position_value) { diff --git a/test/test_list.cpp b/test/test_list.cpp index a24ac735..45be5631 100644 --- a/test/test_list.cpp +++ b/test/test_list.cpp @@ -561,47 +561,96 @@ namespace CompareData compare_data(INITIAL_SIZE, VALUE); DataNDC data(INITIAL_SIZE, VALUE); - size_t offset = 2UL; + //size_t offset = 2UL; DataNDC::iterator i_data = data.begin(); - std::advance(i_data, offset); + //std::advance(i_data, offset); - CompareData::iterator i_compare_data = compare_data.begin(); - std::advance(i_compare_data, offset); + //CompareData::iterator i_compare_data = compare_data.begin(); + //std::advance(i_compare_data, offset); data.emplace(i_data, INSERT_VALUE); - compare_data.emplace(i_compare_data, INSERT_VALUE); + //compare_data.emplace(i_compare_data, INSERT_VALUE); - CHECK_EQUAL(compare_data.size(), data.size()); + //CHECK_EQUAL(compare_data.size(), data.size()); - are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); - CHECK(are_equal); + //CHECK(are_equal); - offset = 0; + //offset = 0; - i_data = data.begin(); - std::advance(i_data, offset); + //i_data = data.begin(); + //std::advance(i_data, offset); - i_compare_data = compare_data.begin(); - std::advance(i_compare_data, offset); + //i_compare_data = compare_data.begin(); + //std::advance(i_compare_data, offset); - data.emplace(i_data, INSERT_VALUE); - compare_data.emplace(i_compare_data, INSERT_VALUE); + //data.emplace(i_data, INSERT_VALUE); + //compare_data.emplace(i_compare_data, INSERT_VALUE); - are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); - CHECK(are_equal); + //CHECK(are_equal); - i_data = data.end(); - i_compare_data = compare_data.end(); + //i_data = data.end(); + //i_compare_data = compare_data.end(); - data.emplace(i_data, VALUE); - compare_data.emplace(i_compare_data, VALUE); + //data.emplace(i_data, VALUE); + //compare_data.emplace(i_compare_data, VALUE); - are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); - CHECK(are_equal); + //CHECK(are_equal); + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_emplace_position_default_constructor) + { + //std::list compare_data; + //DataDC data; + + //size_t offset = 2UL; + + //DataDC::iterator i_data = data.begin(); + //std::advance(i_data, offset); + + //std::list::iterator i_compare_data = compare_data.begin(); + //std::advance(i_compare_data, offset); + + //data.emplace(i_data); + //compare_data.emplace(i_compare_data); + + //CHECK_EQUAL(compare_data.size(), data.size()); + + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + + //CHECK(are_equal); + + //offset = 0; + + //i_data = data.begin(); + //std::advance(i_data, offset); + + //i_compare_data = compare_data.begin(); + //std::advance(i_compare_data, offset); + + //data.emplace(i_data); + //compare_data.emplace(i_compare_data); + + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + + //CHECK(are_equal); + + //i_data = data.end(); + //i_compare_data = compare_data.end(); + + //data.emplace(i_data); + //compare_data.emplace(i_compare_data); + + //are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); + + //CHECK(are_equal); } //************************************************************************* @@ -708,9 +757,10 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_front) { - CompareData compare_data; - DataNDC data; + std::list compare_data; + etl::list data; + compare_data.emplace_front(); compare_data.emplace_front("1"); compare_data.emplace_front("2"); compare_data.emplace_front("3"); @@ -718,6 +768,7 @@ namespace compare_data.emplace_front("5"); compare_data.emplace_front("6"); + CHECK_NO_THROW(data.emplace_front()); CHECK_NO_THROW(data.emplace_front("1")); CHECK_NO_THROW(data.emplace_front("2")); CHECK_NO_THROW(data.emplace_front("3")); @@ -874,9 +925,10 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_emplace_back) { - CompareData compare_data; - DataNDC data; + std::list compare_data; + etl::list data; + compare_data.emplace_back(); compare_data.emplace_back("1"); compare_data.emplace_back("2"); compare_data.emplace_back("3"); @@ -884,6 +936,7 @@ namespace compare_data.emplace_back("5"); compare_data.emplace_back("6"); + CHECK_NO_THROW(data.emplace_back()); CHECK_NO_THROW(data.emplace_back("1")); CHECK_NO_THROW(data.emplace_back("2")); CHECK_NO_THROW(data.emplace_back("3")); diff --git a/test/test_optional.cpp b/test/test_optional.cpp index 6f238229..dd38e331 100644 --- a/test/test_optional.cpp +++ b/test/test_optional.cpp @@ -125,6 +125,16 @@ namespace CHECK_EQUAL(1, DataM::get_instance_count()); } + //************************************************************************* + TEST(test_emplace_zero_parameters) + { + etl::optional result = 1; + result.emplace(); + + CHECK_TRUE(result.has_value()); + CHECK_EQUAL(int(0), int(result.value())); + } + //************************************************************************* TEST(test_moveable) { @@ -503,6 +513,7 @@ namespace return result; } + //************************************************************************* TEST(test_bug_634) { etl::optional result; diff --git a/test/test_priority_queue.cpp b/test/test_priority_queue.cpp index 997b99f6..c8e5218f 100644 --- a/test/test_priority_queue.cpp +++ b/test/test_priority_queue.cpp @@ -42,10 +42,17 @@ namespace struct Item { + Item() + : c('a') + , i(1) + , d(1.2) + { + } + Item(char c_, int i_, double d_) - : c(c_), - i(i_), - d(d_) + : c(c_) + , i(i_) + , d(d_) { } @@ -344,9 +351,12 @@ namespace //************************************************************************* TEST(test_emplace) { - etl::priority_queue priority_queue; + etl::priority_queue priority_queue; std::priority_queue compare_priority_queue; + priority_queue.emplace(); + compare_priority_queue.emplace(); + priority_queue.emplace('d', 4, 7.8); compare_priority_queue.emplace('d', 4, 7.8); diff --git a/test/test_queue.cpp b/test/test_queue.cpp index cf1c4098..a4f12913 100644 --- a/test/test_queue.cpp +++ b/test/test_queue.cpp @@ -37,10 +37,17 @@ namespace { struct Item { + Item() + : c('a') + , i(1) + , d(1.2) + { + } + Item(char c_, int i_, double d_) - : c(c_), - i(i_), - d(d_) + : c(c_) + , i(i_) + , d(d_) { } @@ -357,20 +364,23 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue queue; + etl::queue queue; - queue.emplace('a', 1, 1.2); - queue.emplace('b', 2, 3.4); - queue.emplace('c', 3, 5.6); - queue.emplace('d', 4, 7.8); + queue.emplace(); + queue.emplace('b', 2, 2.3); + queue.emplace('c', 3, 3.4); + queue.emplace('d', 4, 4.5); + queue.emplace('e', 5, 5.6); CHECK(queue.front() == Item('a', 1, 1.2)); queue.pop(); - CHECK(queue.front() == Item('b', 2, 3.4)); + CHECK(queue.front() == Item('b', 2, 2.3)); queue.pop(); - CHECK(queue.front() == Item('c', 3, 5.6)); + CHECK(queue.front() == Item('c', 3, 3.4)); queue.pop(); - CHECK(queue.front() == Item('d', 4, 7.8)); + CHECK(queue.front() == Item('d', 4, 4.5)); + queue.pop(); + CHECK(queue.front() == Item('e', 5, 5.6)); queue.pop(); } diff --git a/test/test_queue_lockable.cpp b/test/test_queue_lockable.cpp index 41036c1a..2bebeb09 100644 --- a/test/test_queue_lockable.cpp +++ b/test/test_queue_lockable.cpp @@ -552,10 +552,10 @@ namespace { QueueData queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); - queue.emplace(1, 2, 3, 4); CHECK(queue.called_lock); CHECK(queue.called_unlock); @@ -564,7 +564,7 @@ namespace Data popped; queue.pop(popped); - CHECK(popped == Data(1, 2, 3, 4)); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_lockable_small.cpp b/test/test_queue_lockable_small.cpp index eed329d7..c1bf69b2 100644 --- a/test/test_queue_lockable_small.cpp +++ b/test/test_queue_lockable_small.cpp @@ -108,7 +108,7 @@ namespace }; //*********************************** - class QueueData : public etl::queue_lockable + class QueueData : public etl::queue_lockable { public: @@ -552,15 +552,20 @@ namespace { QueueData queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK(queue.called_lock); + CHECK(queue.called_unlock); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_memory_model_small.cpp b/test/test_queue_memory_model_small.cpp index 0613d129..274312c5 100644 --- a/test/test_queue_memory_model_small.cpp +++ b/test/test_queue_memory_model_small.cpp @@ -36,6 +36,13 @@ namespace { struct Item { + Item() + : c('a') + , i(1) + , d(1.2) + { + } + Item(char c_, int i_, double d_) : c(c_), i(i_), @@ -342,22 +349,23 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue queue; + etl::queue queue; - queue.emplace('a', 1, 1.2); - queue.emplace('b', 2, 3.4); - queue.emplace('c', 3, 5.6); - queue.emplace('d', 4, 7.8); - - CHECK_EQUAL(4U, queue.size()); + queue.emplace(); + queue.emplace('b', 2, 2.3); + queue.emplace('c', 3, 3.4); + queue.emplace('d', 4, 4.5); + queue.emplace('e', 5, 5.6); CHECK(queue.front() == Item('a', 1, 1.2)); queue.pop(); - CHECK(queue.front() == Item('b', 2, 3.4)); + CHECK(queue.front() == Item('b', 2, 2.3)); queue.pop(); - CHECK(queue.front() == Item('c', 3, 5.6)); + CHECK(queue.front() == Item('c', 3, 3.4)); queue.pop(); - CHECK(queue.front() == Item('d', 4, 7.8)); + CHECK(queue.front() == Item('d', 4, 4.5)); + queue.pop(); + CHECK(queue.front() == Item('e', 5, 5.6)); queue.pop(); } diff --git a/test/test_queue_mpmc_mutex.cpp b/test/test_queue_mpmc_mutex.cpp index 3eec5d97..cdb6e6c1 100644 --- a/test/test_queue_mpmc_mutex.cpp +++ b/test/test_queue_mpmc_mutex.cpp @@ -193,17 +193,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_mpmc_mutex queue; + etl::queue_mpmc_mutex queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_mpmc_mutex_small.cpp b/test/test_queue_mpmc_mutex_small.cpp index 19c6300c..7abf00fc 100644 --- a/test/test_queue_mpmc_mutex_small.cpp +++ b/test/test_queue_mpmc_mutex_small.cpp @@ -205,17 +205,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_mpmc_mutex queue; + etl::queue_mpmc_mutex queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); + CHECK_EQUAL(5U, queue.size()); + Data popped; - CHECK_EQUAL(4U, queue.size()); - + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_atomic.cpp b/test/test_queue_spsc_atomic.cpp index 6b53cabf..232249e1 100644 --- a/test/test_queue_spsc_atomic.cpp +++ b/test/test_queue_spsc_atomic.cpp @@ -312,17 +312,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_atomic queue; + etl::queue_spsc_atomic queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_atomic_small.cpp b/test/test_queue_spsc_atomic_small.cpp index ddbcf0cb..f1ed6fbc 100644 --- a/test/test_queue_spsc_atomic_small.cpp +++ b/test/test_queue_spsc_atomic_small.cpp @@ -330,17 +330,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_atomic queue; + etl::queue_spsc_atomic queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_isr.cpp b/test/test_queue_spsc_isr.cpp index 5b79df4e..2d80f4db 100644 --- a/test/test_queue_spsc_isr.cpp +++ b/test/test_queue_spsc_isr.cpp @@ -74,18 +74,18 @@ namespace struct Data { Data(int a_, int b_ = 2, int c_ = 3, int d_ = 4) - : a(a_), - b(b_), - c(c_), - d(d_) + : a(a_) + , b(b_) + , c(c_) + , d(d_) { } Data() - : a(0), - b(0), - c(0), - d(0) + : a(0) + , b(0) + , c(0) + , d(0) { } @@ -496,17 +496,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_isr queue; + etl::queue_spsc_isr queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_isr_small.cpp b/test/test_queue_spsc_isr_small.cpp index d3b50109..b55f3cd5 100644 --- a/test/test_queue_spsc_isr_small.cpp +++ b/test/test_queue_spsc_isr_small.cpp @@ -74,18 +74,18 @@ namespace struct Data { Data(int a_, int b_ = 2, int c_ = 3, int d_ = 4) - : a(a_), - b(b_), - c(c_), - d(d_) + : a(a_) + , b(b_) + , c(c_) + , d(d_) { } Data() - : a(0), - b(0), - c(0), - d(0) + : a(0) + , b(0) + , c(0) + , d(0) { } @@ -514,17 +514,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_isr queue; + etl::queue_spsc_isr queue; + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_locked.cpp b/test/test_queue_spsc_locked.cpp index b5f07944..993e5e78 100644 --- a/test/test_queue_spsc_locked.cpp +++ b/test/test_queue_spsc_locked.cpp @@ -77,18 +77,18 @@ namespace struct Data { Data(int a_, int b_ = 2, int c_ = 3, int d_ = 4) - : a(a_), - b(b_), - c(c_), - d(d_) + : a(a_) + , b(b_) + , c(c_) + , d(d_) { } Data() - : a(0), - b(0), - c(0), - d(0) + : a(0) + , b(0) + , c(0) + , d(0) { } @@ -501,17 +501,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_locked queue(lock, unlock); + etl::queue_spsc_locked queue(lock, unlock); + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_queue_spsc_locked_small.cpp b/test/test_queue_spsc_locked_small.cpp index 7d1a32bf..644f0a81 100644 --- a/test/test_queue_spsc_locked_small.cpp +++ b/test/test_queue_spsc_locked_small.cpp @@ -518,17 +518,20 @@ namespace //************************************************************************* TEST(test_multiple_emplace) { - etl::queue_spsc_locked queue(lock, unlock); + etl::queue_spsc_locked queue(lock, unlock); + queue.emplace(); queue.emplace(1); queue.emplace(1, 2); queue.emplace(1, 2, 3); queue.emplace(1, 2, 3, 4); - CHECK_EQUAL(4U, queue.size()); + CHECK_EQUAL(5U, queue.size()); Data popped; + queue.pop(popped); + CHECK(popped == Data(0, 0, 0, 0)); queue.pop(popped); CHECK(popped == Data(1, 2, 3, 4)); queue.pop(popped); diff --git a/test/test_stack.cpp b/test/test_stack.cpp index 6fa704cc..3468b680 100644 --- a/test/test_stack.cpp +++ b/test/test_stack.cpp @@ -38,10 +38,17 @@ namespace { struct Item { + Item() + : c('a') + , i(1) + , d(1.2) + { + } + Item(char c_, int i_, double d_) - : c(c_), - i(i_), - d(d_) + : c(c_) + , i(i_) + , d(d_) { } @@ -219,25 +226,30 @@ namespace //************************************************************************* TEST(test_emplace) { - etl::stack stack; + etl::stack stack; - stack.emplace('a', 1, 1.2); + stack.emplace(); CHECK_EQUAL(1U, stack.size()); - stack.emplace('b', 2, 3.4); + stack.emplace('b', 2, 2.3); CHECK_EQUAL(2U, stack.size()); - stack.emplace('c', 3, 5.6); + stack.emplace('c', 3, 3.4); CHECK_EQUAL(3U, stack.size()); - stack.emplace('d', 4, 7.8); + stack.emplace('d', 4, 4.5); CHECK_EQUAL(4U, stack.size()); - CHECK(stack.top() == Item('d', 4, 7.8)); + stack.emplace('e', 5, 5.6); + CHECK_EQUAL(5U, stack.size()); + + CHECK(stack.top() == Item('e', 5, 5.6)); stack.pop(); - CHECK(stack.top() == Item('c', 3, 5.6)); + CHECK(stack.top() == Item('d', 4, 4.5)); stack.pop(); - CHECK(stack.top() == Item('b', 2, 3.4)); + CHECK(stack.top() == Item('c', 3, 3.4)); + stack.pop(); + CHECK(stack.top() == Item('b', 2, 2.3)); stack.pop(); CHECK(stack.top() == Item('a', 1, 1.2)); } diff --git a/test/test_vector.cpp b/test/test_vector.cpp index bc5e5cf8..7dbfb8e5 100644 --- a/test/test_vector.cpp +++ b/test/test_vector.cpp @@ -795,6 +795,94 @@ namespace } } + //************************************************************************* + TEST(test_emplace_default) + { + const int Initial = 1; + const int Default = 2; + + struct S + { + S() + : value(Default) + { + } + + S(int v) + : value(v) + { + } + + bool operator ==(const S& rhs) const + { + return value == rhs.value; + } + + int value; + }; + + // First fill with Initial values. + etl::vector data; + data.resize(SIZE, S(Initial)); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace(data.end()); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(S()); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + + //************************************************************************* + TEST(test_emplace_back_default) + { + const int Initial = 1; + const int Default = 2; + + struct S + { + S() + : value(Default) + { + } + + S(int v) + : value(v) + { + } + + bool operator ==(const S& rhs) const + { + return value == rhs.value; + } + + int value; + }; + + // First fill with Initial values. + etl::vector data; + data.resize(SIZE, S(Initial)); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace_back(); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(S()); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + //************************************************************************* #include "etl/private/diagnostic_array_bounds_push.h" TEST_FIXTURE(SetupFixture, test_insert_position_value_excess) diff --git a/test/test_vector_non_trivial.cpp b/test/test_vector_non_trivial.cpp index 9a76b87a..459715bb 100644 --- a/test/test_vector_non_trivial.cpp +++ b/test/test_vector_non_trivial.cpp @@ -771,7 +771,6 @@ namespace #endif //************************************************************************* - // To test the CPP03 versions then ETL_TEST_VECTOR_CPP11 must be set to 0 in vector.h TEST_FIXTURE(SetupFixture, test_emplace_back_multiple) { class Data diff --git a/test/test_vector_pointer.cpp b/test/test_vector_pointer.cpp index d07f53fb..1967d409 100644 --- a/test/test_vector_pointer.cpp +++ b/test/test_vector_pointer.cpp @@ -1068,6 +1068,52 @@ namespace CHECK_EQUAL(&d2, data.emplace_back(&d2)); } + //************************************************************************* + TEST(test_emplace_default) + { + static int initial = 0; + + // First fill with Initial values. + etl::vector data; + data.resize(SIZE, &initial); + data.clear(); + + // Then emplace Default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace(data.begin()); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(nullptr); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + + //************************************************************************* + TEST(test_emplace_back_default) + { + static int initial = 0; + + // First fill with initial values. + etl::vector data; + data.resize(SIZE, &initial); + data.clear(); + + // Then emplace default values. + for (size_t i = 0; i < SIZE; ++i) + { + data.emplace_back(); + } + + // Compare with an array of default values. + std::array compare_data; + compare_data.fill(nullptr); + + CHECK_TRUE(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_pop_back) { diff --git a/test/vs2022/etl.sln b/test/vs2022/etl.sln index 4e35f01f..48c644d9 100644 --- a/test/vs2022/etl.sln +++ b/test/vs2022/etl.sln @@ -17,6 +17,8 @@ Global Debug MSVC C++17 - No STL|x64 = Debug MSVC C++17 - No STL|x64 Debug MSVC C++17|Win32 = Debug MSVC C++17|Win32 Debug MSVC C++17|x64 = Debug MSVC C++17|x64 + Debug MSVC C++20 - Force C++03|Win32 = Debug MSVC C++20 - Force C++03|Win32 + Debug MSVC C++20 - Force C++03|x64 = Debug MSVC C++20 - Force C++03|x64 Debug MSVC C++20 - No STL|Win32 = Debug MSVC C++20 - No STL|Win32 Debug MSVC C++20 - No STL|x64 = Debug MSVC C++20 - No STL|x64 Debug MSVC C++20 - No virtual messages|Win32 = Debug MSVC C++20 - No virtual messages|Win32 @@ -49,6 +51,10 @@ Global {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++17|Win32.Build.0 = Debug MSVC C++17|Win32 {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++17|x64.ActiveCfg = Debug MSVC C++17|x64 {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++17|x64.Build.0 = Debug MSVC C++17|x64 + {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - Force C++03|Win32.ActiveCfg = Debug MSVC C++20 - Force C++03|Win32 + {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - Force C++03|Win32.Build.0 = Debug MSVC C++20 - Force C++03|Win32 + {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - Force C++03|x64.ActiveCfg = Debug MSVC C++20 - Force C++03|x64 + {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - Force C++03|x64.Build.0 = Debug MSVC C++20 - Force C++03|x64 {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - No STL|Win32.ActiveCfg = Debug MSVC C++20 - No STL|Win32 {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - No STL|Win32.Build.0 = Debug MSVC C++20 - No STL|Win32 {C21DF78C-D8E0-46AB-9D6F-D38A3C1CB0FB}.Debug MSVC C++20 - No STL|x64.ActiveCfg = Debug MSVC C++20 - No STL|x64 diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 8b29a55d..96785631 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -41,6 +41,14 @@ Debug MSVC C++17 x64 + + Debug MSVC C++20 - Force C++03 + Win32 + + + Debug MSVC C++20 - Force C++03 + x64 + Debug MSVC C++20 - No STL Win32 @@ -119,6 +127,13 @@ Unicode false + + Application + true + v143 + Unicode + false + Application true @@ -345,6 +360,12 @@ v143 Unicode + + Application + true + v143 + Unicode + Application true @@ -587,6 +608,9 @@ + + + @@ -689,6 +713,9 @@ + + + @@ -816,6 +843,11 @@ true $(Configuration)\ + + false + true + $(Configuration)\ + false true @@ -989,6 +1021,10 @@ true true + + true + true + true true @@ -1217,6 +1253,32 @@ "$(OutDir)\etl.exe" + + + + + Level2 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;ETL_FORCE_TEST_CPP03_IMPLEMENTATION;%(PreprocessorDefinitions) + ../../../unittest-cpp/;../../include;../../test + + + true + stdcpp20 + EditAndContinue + /Zc:__cplusplus %(AdditionalOptions) + true + EnableFastChecks + false + + + Console + true + + + "$(OutDir)\etl.exe" + + @@ -2052,6 +2114,27 @@ $(OutDir)\etl.exe + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ../../unittest-cpp/UnitTest++/;../../include/etl;../../test + + + false + stdcpp14 + + + Console + true + + + $(OutDir)\etl.exe + + @@ -3173,6 +3256,7 @@ true true true + true true true true @@ -3209,6 +3293,7 @@ true true true + true true true true @@ -3245,6 +3330,7 @@ true true true + true true true true @@ -3281,6 +3367,7 @@ true true true + true true true true @@ -3361,6 +3448,7 @@ true true true + true true true true @@ -3397,6 +3485,7 @@ true true true + true true true true @@ -3433,6 +3522,7 @@ true true true + true true true true @@ -3469,6 +3559,7 @@ true true true + true true true true @@ -3508,6 +3599,7 @@ true true true + true true true true @@ -3560,6 +3652,7 @@ true true true + true true true true @@ -3601,6 +3694,7 @@ true true true + true true true true @@ -3642,6 +3736,7 @@ true true true + true true true true @@ -3683,6 +3778,7 @@ true true true + true true true true @@ -3724,6 +3820,7 @@ true true true + true true true true @@ -3765,6 +3862,7 @@ true true true + true true true true @@ -3806,6 +3904,7 @@ true true true + true true true true @@ -3847,6 +3946,7 @@ true true true + true true true true @@ -3888,6 +3988,7 @@ true true true + true true true true @@ -3929,6 +4030,7 @@ true true true + true true true true @@ -3954,6 +4056,7 @@ true true true + true true true true @@ -3995,6 +4098,7 @@ true true true + true true true true @@ -4047,6 +4151,7 @@ true true true + true true true true @@ -4075,6 +4180,7 @@ true true true + true true true true @@ -4124,6 +4230,7 @@ true true true + true true true true @@ -4165,6 +4272,7 @@ true true true + true true true true @@ -4206,6 +4314,7 @@ true true true + true true true true @@ -4247,6 +4356,7 @@ true true true + true true true true @@ -4272,6 +4382,7 @@ true true true + true true true true @@ -4309,6 +4420,7 @@ true true true + true true true true @@ -4362,6 +4474,7 @@ true true true + true true true true @@ -4403,6 +4516,7 @@ true true true + true true true true @@ -4444,6 +4558,7 @@ true true true + true true true true @@ -4469,6 +4584,7 @@ true true true + true true true true @@ -4506,6 +4622,7 @@ true true true + true true true true @@ -4543,6 +4660,7 @@ true true true + true true true true @@ -4596,6 +4714,7 @@ true true true + true true true true @@ -4637,6 +4756,7 @@ true true true + true true true true @@ -4678,6 +4798,7 @@ true true true + true true true true @@ -4703,6 +4824,7 @@ true true true + true true true true @@ -4755,6 +4877,7 @@ true true true + true true true true @@ -4796,6 +4919,7 @@ true true true + true true true true @@ -4837,6 +4961,7 @@ true true true + true true true true @@ -4878,6 +5003,7 @@ true true true + true true true true @@ -4919,6 +5045,7 @@ true true true + true true true true @@ -4960,6 +5087,7 @@ true true true + true true true true @@ -5001,6 +5129,7 @@ true true true + true true true true @@ -5042,6 +5171,7 @@ true true true + true true true true @@ -5083,6 +5213,7 @@ true true true + true true true true @@ -5124,6 +5255,7 @@ true true true + true true true true @@ -5165,6 +5297,7 @@ true true true + true true true true @@ -5206,6 +5339,7 @@ true true true + true true true true @@ -5247,6 +5381,7 @@ true true true + true true true true @@ -5288,6 +5423,7 @@ true true true + true true true true @@ -5329,6 +5465,7 @@ true true true + true true true true @@ -5370,6 +5507,7 @@ true true true + true true true true @@ -5411,6 +5549,7 @@ true true true + true true true true @@ -5452,6 +5591,7 @@ true true true + true true true true @@ -5493,6 +5633,7 @@ true true true + true true true true @@ -5534,6 +5675,7 @@ true true true + true true true true @@ -5559,6 +5701,7 @@ true true true + true true true true @@ -5610,6 +5753,7 @@ true true true + true true true true @@ -5651,6 +5795,7 @@ true true true + true true true true @@ -5692,6 +5837,7 @@ true true true + true true true true @@ -5733,6 +5879,7 @@ true true true + true true true true @@ -5774,6 +5921,7 @@ true true true + true true true true @@ -5815,6 +5963,7 @@ true true true + true true true true @@ -5856,6 +6005,7 @@ true true true + true true true true @@ -5897,6 +6047,7 @@ true true true + true true true true @@ -5938,6 +6089,7 @@ true true true + true true true true @@ -5979,6 +6131,7 @@ true true true + true true true true @@ -6020,6 +6173,7 @@ true true true + true true true true @@ -6061,6 +6215,7 @@ true true true + true true true true @@ -6102,6 +6257,7 @@ true true true + true true true true @@ -6143,6 +6299,7 @@ true true true + true true true true @@ -6184,6 +6341,7 @@ true true true + true true true true @@ -6225,6 +6383,7 @@ true true true + true true true true @@ -6266,6 +6425,7 @@ true true true + true true true true @@ -6307,6 +6467,7 @@ true true true + true true true true @@ -6348,6 +6509,7 @@ true true true + true true true true @@ -6389,6 +6551,7 @@ true true true + true true true true @@ -6430,6 +6593,7 @@ true true true + true true true true @@ -6471,6 +6635,7 @@ true true true + true true true true @@ -6512,6 +6677,7 @@ true true true + true true true true @@ -6553,6 +6719,7 @@ true true true + true true true true @@ -6594,6 +6761,7 @@ true true true + true true true true @@ -6635,6 +6803,7 @@ true true true + true true true true @@ -6676,6 +6845,7 @@ true true true + true true true true @@ -6717,6 +6887,7 @@ true true true + true true true true @@ -6758,6 +6929,7 @@ true true true + true true true true @@ -6799,6 +6971,7 @@ true true true + true true true true @@ -6840,6 +7013,7 @@ true true true + true true true true @@ -6865,6 +7039,7 @@ true true true + true true true true @@ -6900,6 +7075,7 @@ true true true + true true true true @@ -6936,6 +7112,7 @@ true true true + true true true true @@ -6988,6 +7165,7 @@ true true true + true true true true @@ -7029,6 +7207,7 @@ true true true + true true true true @@ -7070,6 +7249,7 @@ true true true + true true true true @@ -7111,6 +7291,7 @@ true true true + true true true true @@ -7152,6 +7333,7 @@ true true true + true true true true @@ -7177,6 +7359,7 @@ true true true + true true true true @@ -7211,6 +7394,7 @@ true true true + true true true true @@ -7263,6 +7447,7 @@ true true true + true true true true @@ -7304,6 +7489,7 @@ true true true + true true true true @@ -7345,6 +7531,7 @@ true true true + true true true true @@ -7386,6 +7573,7 @@ true true true + true true true true @@ -7427,6 +7615,7 @@ true true true + true true true true @@ -7468,6 +7657,7 @@ true true true + true true true true @@ -7509,6 +7699,7 @@ true true true + true true true true @@ -7550,6 +7741,7 @@ true true true + true true true true @@ -7591,6 +7783,7 @@ true true true + true true true true @@ -7632,6 +7825,7 @@ true true true + true true true true @@ -7673,6 +7867,7 @@ true true true + true true true true @@ -7714,6 +7909,7 @@ true true true + true true true true @@ -7755,6 +7951,7 @@ true true true + true true true true @@ -7796,6 +7993,7 @@ true true true + true true true true @@ -7837,6 +8035,7 @@ true true true + true true true true @@ -7878,6 +8077,7 @@ true true true + true true true true @@ -7919,6 +8119,7 @@ true true true + true true true true @@ -7960,6 +8161,7 @@ true true true + true true true true @@ -8001,6 +8203,7 @@ true true true + true true true true @@ -8042,6 +8245,7 @@ true true true + true true true true @@ -8083,6 +8287,7 @@ true true true + true true true true @@ -8124,6 +8329,7 @@ true true true + true true true true @@ -8165,6 +8371,7 @@ true true true + true true true true @@ -8206,6 +8413,7 @@ true true true + true true true true @@ -8247,6 +8455,7 @@ true true true + true true true true @@ -8288,6 +8497,7 @@ true true true + true true true true @@ -8329,6 +8539,7 @@ true true true + true true true true @@ -8370,6 +8581,7 @@ true true true + true true true true @@ -8411,6 +8623,7 @@ true true true + true true true true @@ -8452,6 +8665,7 @@ true true true + true true true true @@ -8477,6 +8691,7 @@ true true true + true true true true @@ -8530,6 +8745,7 @@ true true true + true true true true @@ -8571,6 +8787,7 @@ true true true + true true true true @@ -8612,6 +8829,7 @@ true true true + true true true true @@ -8653,6 +8871,7 @@ true true true + true true true true @@ -8694,6 +8913,7 @@ true true true + true true true true @@ -8735,6 +8955,7 @@ true true true + true true true true @@ -8776,6 +8997,7 @@ true true true + true true true true @@ -8817,6 +9039,7 @@ true true true + true true true true @@ -8858,6 +9081,7 @@ true true true + true true true true @@ -8899,6 +9123,7 @@ true true true + true true true true @@ -8940,6 +9165,7 @@ true true true + true true true true @@ -8981,6 +9207,7 @@ true true true + true true true true @@ -9022,6 +9249,7 @@ true true true + true true true true @@ -9063,6 +9291,7 @@ true true true + true true true true @@ -9104,6 +9333,7 @@ true true true + true true true true @@ -9145,6 +9375,7 @@ true true true + true true true true @@ -9186,6 +9417,7 @@ true true true + true true true true @@ -9227,6 +9459,7 @@ true true true + true true true true @@ -9268,6 +9501,7 @@ true true true + true true true true @@ -9309,6 +9543,7 @@ true true true + true true true true @@ -9350,6 +9585,7 @@ true true true + true true true true @@ -9391,6 +9627,7 @@ true true true + true true true true @@ -9432,6 +9669,7 @@ true true true + true true true true @@ -9473,6 +9711,7 @@ true true true + true true true true @@ -9514,6 +9753,7 @@ true true true + true true true true @@ -9555,6 +9795,7 @@ true true true + true true true true @@ -9596,6 +9837,7 @@ true true true + true true true true @@ -9637,6 +9879,7 @@ true true true + true true true true @@ -9678,6 +9921,7 @@ true true true + true true true true @@ -9719,6 +9963,7 @@ true true true + true true true true @@ -9760,6 +10005,7 @@ true true true + true true true true @@ -9785,6 +10031,7 @@ true true true + true true true true @@ -9822,6 +10069,7 @@ true true true + true true true true @@ -9859,6 +10107,7 @@ true true true + true true true true @@ -9912,6 +10161,7 @@ true true true + true true true true @@ -9953,6 +10203,7 @@ true true true + true true true true @@ -9994,6 +10245,7 @@ true true true + true true true true @@ -10035,6 +10287,7 @@ true true true + true true true true @@ -10076,6 +10329,7 @@ true true true + true true true true @@ -10101,6 +10355,7 @@ true true true + true true true true @@ -10138,6 +10393,7 @@ true true true + true true true true @@ -10191,6 +10447,7 @@ true true true + true true true true @@ -10232,6 +10489,7 @@ true true true + true true true true @@ -10273,6 +10531,7 @@ true true true + true true true true @@ -10298,6 +10557,7 @@ true true true + true true true true @@ -10351,6 +10611,7 @@ true true true + true true true true @@ -10392,6 +10653,7 @@ true true true + true true true true @@ -10433,6 +10695,7 @@ true true true + true true true true @@ -10474,6 +10737,7 @@ true true true + true true true true @@ -10515,6 +10779,7 @@ true true true + true true true true @@ -10556,6 +10821,7 @@ true true true + true true true true @@ -10597,6 +10863,7 @@ true true true + true true true true @@ -10638,6 +10905,7 @@ true true true + true true true true @@ -10679,6 +10947,7 @@ true true true + true true true true @@ -10720,6 +10989,7 @@ true true true + true true true true @@ -10761,6 +11031,7 @@ true true true + true true true true @@ -10802,6 +11073,7 @@ true true true + true true true true @@ -10843,6 +11115,7 @@ true true true + true true true true @@ -10884,6 +11157,7 @@ true true true + true true true true @@ -10925,6 +11199,7 @@ true true true + true true true true @@ -10966,6 +11241,7 @@ true true true + true true true true @@ -11007,6 +11283,7 @@ true true true + true true true true @@ -11048,6 +11325,7 @@ true true true + true true true true @@ -11089,6 +11367,7 @@ true true true + true true true true @@ -11130,6 +11409,7 @@ true true true + true true true true @@ -11171,6 +11451,7 @@ true true true + true true true true @@ -11212,6 +11493,7 @@ true true true + true true true true @@ -11253,6 +11535,7 @@ true true true + true true true true @@ -11294,6 +11577,7 @@ true true true + true true true true @@ -11335,6 +11619,7 @@ true true true + true true true true @@ -11376,6 +11661,7 @@ true true true + true true true true @@ -11417,6 +11703,7 @@ true true true + true true true true @@ -11458,6 +11745,7 @@ true true true + true true true true @@ -11499,6 +11787,7 @@ true true true + true true true true @@ -11540,6 +11829,7 @@ true true true + true true true true @@ -11581,6 +11871,7 @@ true true true + true true true true @@ -11622,6 +11913,7 @@ true true true + true true true true @@ -11663,6 +11955,7 @@ true true true + true true true true @@ -11704,6 +11997,7 @@ true true true + true true true true @@ -11745,6 +12039,7 @@ true true true + true true true true @@ -11786,6 +12081,7 @@ true true true + true true true true @@ -11827,6 +12123,7 @@ true true true + true true true true @@ -11868,6 +12165,7 @@ true true true + true true true true @@ -11909,6 +12207,7 @@ true true true + true true true true @@ -11934,6 +12233,7 @@ true true true + true true true true @@ -11987,6 +12287,7 @@ true true true + true true true true @@ -12028,6 +12329,7 @@ true true true + true true true true @@ -12069,6 +12371,7 @@ true true true + true true true true @@ -12110,6 +12413,7 @@ true true true + true true true true @@ -12151,6 +12455,7 @@ true true true + true true true true @@ -12192,6 +12497,7 @@ true true true + true true true true @@ -12233,6 +12539,7 @@ true true true + true true true true @@ -12274,6 +12581,7 @@ true true true + true true true true @@ -12315,6 +12623,7 @@ true true true + true true true true @@ -12356,6 +12665,7 @@ true true true + true true true true @@ -12397,6 +12707,7 @@ true true true + true true true true @@ -12438,6 +12749,7 @@ true true true + true true true true @@ -12479,6 +12791,7 @@ true true true + true true true true @@ -12520,6 +12833,7 @@ true true true + true true true true @@ -12561,6 +12875,7 @@ true true true + true true true true @@ -12586,6 +12901,7 @@ true true true + true true true true @@ -12638,6 +12954,7 @@ true true true + true true true true @@ -12679,6 +12996,7 @@ true true true + true true true true @@ -12720,6 +13038,7 @@ true true true + true true true true @@ -12761,6 +13080,7 @@ true true true + true true true true @@ -12802,6 +13122,7 @@ true true true + true true true true @@ -12843,6 +13164,7 @@ true true true + true true true true @@ -12884,6 +13206,7 @@ true true true + true true true true @@ -12925,6 +13248,7 @@ true true true + true true true true @@ -12966,6 +13290,7 @@ true true true + true true true true @@ -13007,6 +13332,7 @@ true true true + true true true true @@ -13048,6 +13374,7 @@ true true true + true true true true @@ -13089,6 +13416,7 @@ true true true + true true true true @@ -13130,6 +13458,7 @@ true true true + true true true true @@ -13171,6 +13500,7 @@ true true true + true true true true @@ -13197,6 +13527,7 @@ true true true + true true true true @@ -13249,6 +13580,7 @@ true true true + true true true true @@ -13290,6 +13622,7 @@ true true true + true true true true @@ -13331,6 +13664,7 @@ true true true + true true true true @@ -13372,6 +13706,7 @@ true true true + true true true true @@ -13413,6 +13748,7 @@ true true true + true true true true @@ -13454,6 +13790,7 @@ true true true + true true true true @@ -13495,6 +13832,7 @@ true true true + true true true true @@ -13536,6 +13874,7 @@ true true true + true true true true @@ -13577,6 +13916,7 @@ true true true + true true true true @@ -13618,6 +13958,7 @@ true true true + true true true true @@ -13659,6 +14000,7 @@ true true true + true true true true @@ -13700,6 +14042,7 @@ true true true + true true true true @@ -13741,6 +14084,7 @@ true true true + true true true true @@ -13782,6 +14126,7 @@ true true true + true true true true @@ -13823,6 +14168,7 @@ true true true + true true true true @@ -13864,6 +14210,7 @@ true true true + true true true true @@ -13905,6 +14252,7 @@ true true true + true true true true @@ -13946,6 +14294,7 @@ true true true + true true true true @@ -14106,6 +14455,7 @@ false false false + false false false false @@ -14144,6 +14494,7 @@ false false false + false false false false @@ -14201,6 +14552,7 @@ false false false + false false false false @@ -14239,6 +14591,7 @@ false false false + false false false false @@ -14291,6 +14644,7 @@ false false false + false false false false @@ -14329,6 +14683,7 @@ false false false + false false false false @@ -14371,6 +14726,7 @@ false false false + false false false false @@ -14409,6 +14765,7 @@ false false false + false false false false @@ -14451,6 +14808,7 @@ false false false + false false false false @@ -14489,6 +14847,7 @@ false false false + false false false false @@ -14531,6 +14890,7 @@ false false false + false false false false @@ -14569,6 +14929,7 @@ false false false + false false false false @@ -14616,6 +14977,7 @@ false false false + false false false false @@ -14654,6 +15016,7 @@ false false false + false false false false @@ -14700,6 +15063,7 @@ false false false + false false false false @@ -14738,6 +15102,7 @@ false false false + false false false false @@ -14793,6 +15158,7 @@ false false false + false false false false @@ -14831,6 +15197,7 @@ false false false + false false false false @@ -15051,6 +15418,7 @@ true true true + true true true true @@ -15087,6 +15455,7 @@ true true true + true true true true @@ -15123,6 +15492,7 @@ true true true + true true true true @@ -15159,6 +15529,7 @@ true true true + true true true true