diff --git a/.gitignore b/.gitignore index 72c021e0..c9455d30 100644 --- a/.gitignore +++ b/.gitignore @@ -325,3 +325,12 @@ test/vs2019/Test2 test/vs2019/Debug MSVC - Force C++03 test/vs2019/Debug LLVM - No STL test/vs2019/Debug - No STL +test/meson-info +test/etl_unit_tests.p +test/meson-logs +test/meson-private +test/.ninja_deps +test/.ninja_log +test/build.ninja +test/compile_commands.json +test/etl_unit_tests diff --git a/include/etl/memory.h b/include/etl/memory.h index 7c951cc3..81dae7ba 100644 --- a/include/etl/memory.h +++ b/include/etl/memory.h @@ -58,7 +58,7 @@ namespace etl ///\ingroup memory //***************************************************************************** template - T* addressof(T& t) + ETL_CONSTEXPR T* addressof(T& t) { #if ETL_CPP11_SUPPORTED && ETL_USING_STL return std::addressof(t); diff --git a/include/etl/multi_span.h b/include/etl/multi_span.h new file mode 100644 index 00000000..d54dd4f6 --- /dev/null +++ b/include/etl/multi_span.h @@ -0,0 +1,336 @@ +///\file + +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2021 jwellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#ifndef ETL_MULTI_SPAN_INCLUDED +#define ETL_MULTI_SPAN_INCLUDED + +#include "platform.h" +#include "iterator.h" +#include "algorithm.h" +#include "vector.h" +#include "span.h" + +///\defgroup multi_multi_span multi_span multi_span +/// Scatter/Gather functionality +///\ingroup containers + +namespace etl +{ + template + class multi_span + { + public: + + typedef T element_type; + typedef typename etl::remove_cv::type value_type; + typedef size_t size_type; + typedef T& reference; + typedef const T& const_reference; + typedef T* pointer; + typedef const T* const_pointer; + + typedef etl::span span_type; + typedef etl::span span_list_type; + + //************************************************************************* + /// Iterator + //************************************************************************* + //class iterator : etl::iterator + //{ + //public: + + // friend class const_iterator; + + // iterator() + // : p_current() + // , p_end() + // , p_value(ETL_NULLPTR) + // { + // } + + // //***************************************** + // iterator& operator ++() + // { + // if (p_current != p_end) + // { + // ++p_value; + + // if (p_value == p_current->end()) + // { + // while (pcurrent.empty() && (p_current != p_end)) + // { + // ++p_current; + // } + + // if (p_current != p_end) + // { + // p_value = p_current->begin(); + // } + // else + // { + // p_value = ETL_NULLPTR; + // } + // } + // } + + // return *this; + // } + + // //***************************************** + // iterator operator ++(int) + // { + // iterator temp = *this; + + // operator ++(); + + // return temp; + // } + + //private: + + // //***************************************** + // iterator(span_list_iterator p_current_, span_list_iterator p_end_) + // : p_current(p_current_) + // , p_end(p_end_) + // , p_value(ETL_NULLPTR) + // { + // p_value = p_current->begin(); + // } + + // typedef const span_type* span_list_pointer; + + // span_list_pointer p_current; + // span_list_pointer p_end; + // pointer p_value; + //}; + + ////************************************************************************* + ///// Const Iterator + ////************************************************************************* + //class const_iterator : etl::iterator + //{ + //public: + + // friend class imulti_span; + + + + //private: + + //}; + + //typedef ETL_OR_STD::reverse_iterator reverse_iterator; + //typedef ETL_OR_STD::reverse_iterator const_reverse_iterator; + + //************************************************************************* + /// Constructor. + //************************************************************************* + ETL_CONSTEXPR multi_span(span_list_type span_list_) + : span_list(span_list_) + { + } + + //************************************************************************* + /// Construct from a container or other type that supports + /// data() and size() member functions. + //************************************************************************* + template + ETL_CONSTEXPR multi_span(TContainer& a) ETL_NOEXCEPT + : mbegin(a.data()) + , mend(a.data() + a.size()) + { + } + + //************************************************************************* + /// Construct from a container or other type that supports + /// data() and size() member functions. + //************************************************************************* + template + ETL_CONSTEXPR multi_span(const TContainer& a) ETL_NOEXCEPT + : mbegin(a.data()) + , mend(a.data() + a.size()) + { + } + + //************************************************************************* + /// Constructor. + //************************************************************************* + template + ETL_CONSTEXPR multi_span(TIterator begin_, TIterator end_) + : span_list(etl::addressof(*begin_), etl::distance(begin_, end_)) + { + } + + //************************************************************************* + /// Constructor. + //************************************************************************* + template + ETL_CONSTEXPR multi_span(TIterator begin_, size_t length_) + : span_list(etl::addressof(*begin_), length_) + { + } + + //************************************************************************* + /// Copy Constructor. + //************************************************************************* + ETL_CONSTEXPR multi_span(const multi_span& other) + : span_list(other.span_list) + { + } + + //************************************************************************* + /// Assignment operator + //************************************************************************* + ETL_CONSTEXPR multi_span& operator = (const multi_span & other) + { + span_list = other.span_list; + } + + ////************************************************************************* + ///// + ////************************************************************************* + //ETL_CONSTEXPR iterator begin() const + //{ + // return iterator(); + //} + + ////************************************************************************* + ///// + ////************************************************************************* + //ETL_CONSTEXPR iterator end() const + //{ + // return iterator(); + //} + + //************************************************************************* + /// copy + //************************************************************************* + template + void copy(TIterator destination) + { + for (span_list_type::iterator sp = span_list.begin(); sp != span_list.end(); ++sp) + { + etl::copy(sp->begin(), sp->end(), destination); + etl::advance(destination, sp->size()); + } + } + + //************************************************************************* + /// for_each + //************************************************************************* + template + void for_each(TFunctor functor) + { + for (span_list_type::iterator sp = span_list.begin(); sp != span_list.end(); ++sp) + { + etl::for_each(sp->begin(), sp->end(), functor); + } + } + + //************************************************************************* + /// transform + //************************************************************************* + template + void transform(TIterator destination, TFunction function) + { + for (span_list_type::iterator sp = span_list.begin(); + sp != span_list.end(); + ++sp) + { + etl::transform(sp->begin(), sp->end(), destination, function); + etl::advance(destination, sp->size()); + } + } + + //************************************************************************* + /// Returns the number of elements in the multi_span. + //************************************************************************* + ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT + { + size_t total_n_spans = 0U; + + for (span_list_type::iterator itr = span_list.begin(); + itr != span_list.end(); + ++itr) + { + total_n_spans += itr->size(); + } + + return total_n_spans; + } + + //************************************************************************* + /// Returns true if the multi_span size is zero. + //************************************************************************* + ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT + { + if (span_list.empty()) + { + return true; + } + else + { + return size() == 0U; + } + } + + //************************************************************************* + /// Returns the size of the multi_span. + //************************************************************************* + ETL_CONSTEXPR14 size_t size_bytes() const ETL_NOEXCEPT + { + size_t total_n_spans_bytes = 0U; + + for (span_list_type::iterator itr = span_list.begin(); + itr != span_list.end(); + ++itr) + { + total_n_spans_bytes += itr->size_bytes(); + } + + return total_n_spans_bytes; + } + + //************************************************************************* + /// Returns the number of spans in the multi_span. + //************************************************************************* + ETL_CONSTEXPR size_t size_spans() const ETL_NOEXCEPT + { + return span_list.size(); + } + + private: + + span_list_type span_list; + }; +} + +#endif + diff --git a/meson.build b/meson.build index 4a1fe78c..363f691b 100644 --- a/meson.build +++ b/meson.build @@ -179,6 +179,8 @@ unittestcpp_dep = dependency('UnitTest++', disabler: true, ) +threads_dep = dependency('threads') + etl_unit_tests = executable('etl_unit_tests', include_directories: [ include_directories('test'), @@ -187,7 +189,7 @@ etl_unit_tests = executable('etl_unit_tests', include_directories('include') ], sources: etl_test_sources, - dependencies: unittestcpp_dep, + dependencies: [unittestcpp_dep, threads_dep], cpp_args: [ '-fexceptions', '-DENABLE_ETL_UNIT_TESTS', diff --git a/test/vs2019/etl.vcxproj b/test/vs2019/etl.vcxproj index 07cd5870..0d0216fc 100644 --- a/test/vs2019/etl.vcxproj +++ b/test/vs2019/etl.vcxproj @@ -1816,6 +1816,7 @@ + @@ -8220,6 +8221,7 @@ + diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 2232285b..1184a283 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -1152,6 +1152,9 @@ ETL\Utilities\Mutex + + ETL\Containers + @@ -3020,6 +3023,9 @@ Source Files + + Source Files + @@ -3164,4 +3170,4 @@ Resource Files - \ No newline at end of file +