From 4aa74e35f23d85a89d813d5fe28dbecacf02e8f5 Mon Sep 17 00:00:00 2001 From: Bo Rydberg <2945606+bolry@users.noreply.github.com> Date: Fri, 12 Mar 2021 15:13:31 +0100 Subject: [PATCH] Add free-standing sanity tests for C++03/11/14/17 (#351) * Add ETL_CONSTEXPR for state_chart, transision and state constructors. * Updated versions * Added ETL_CONSTEXPR * Added ETL_CONSTEXPR * Updated version numbers * Updated version numbers * Add buffer descriptors * Issue 297 * Updated version numbers * Added extra std/etl conversions * Updated strings Re-introduced case utilities Fixed make_string for empty strings * make_string_view + fix constexpr in flags.h * Added etl::buffer_descriptors. Added std/etl pair conversions. Added etl::make_string_view. Resolved issue with zero length literals for etl::make_string Resolved etl::flags constexpr issues. Added atomics for clang. Resolved type_traits issues for GCC < v5 * Added etl::buffer_descriptors. Added std/etl pair conversions. Added etl::make_string_view. Resolved issue with zero length literals for etl::make_string Resolved etl::flags constexpr issues. Added atomics for clang. Resolved type_traits issues for GCC < v5 * Fixed warnings * Disabled ASAN option in Visual Studio project. * Fix make_string for zero length literals Remove redundant test support code * Updated notes * Adding Tests for a fractional -1.0 < x < 0, fixing missing sign for integral parts equals to zero 0 (#306) Co-authored-by: Heinz-Peter Liechtenecker * #306-bugfix-to-string-formatting * Updated version numbers * Update setup-msbuild to v1.0.2 Updates Actions core toolkit to fix vulnerability on environment/path variable setting. * circular_buffer_ext * forward_list_ext * list_ext * indirect_vector_ext * string_ext * vector_ext * Updated .leu * Merge remote-tracking branch 'origin/feature/no-huge-value' into development * Remove VS2017 project * Refactor of etl::buffer_descriptors interface * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * clang.yml hack for testing * clang hack for testing * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Refactor buffer_descriptors test * Fixed non-initialisation of in_use flag. * Fixed non-initialisation of in_use flag. * Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing * Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing * Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing * Squashed commit of the following: commit fa9d9592aa7cb686ae1e8c6eeedfcbfda7a59835 Author: John Wellbelove Date: Thu Nov 26 19:26:11 2020 +0000 format_spec may be constexpr * Squashed commit of the following: commit 638cceaf9c4a6964e58894adb36d633b01a1d5ac Author: John Wellbelove Date: Wed Nov 25 17:57:06 2020 +0000 Strings inherit secure status on copy. commit 5f1ab55c61ed62b5c234b5e1d6ac3ef362b78851 Author: John Wellbelove Date: Tue Nov 24 22:33:08 2020 +0000 Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing commit c26e42253f4502c3afb943a7ff1f7ef0f79c475b Author: John Wellbelove Date: Tue Nov 24 19:32:48 2020 +0000 Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing commit 3cbe1a80030263aac53616391fa434d0501f4f26 Author: John Wellbelove Date: Tue Nov 24 19:31:03 2020 +0000 Squashed commit of the following: commit dceb56dd1a19be6fe9b991bb50e08902eefe36a8 Author: John Wellbelove Date: Tue Nov 24 19:27:18 2020 +0000 Fixed non-initialisation of in_use flag. commit c7ee1d6574ca5d95869152c5f8e4e6d02a7fa6bc Author: John Wellbelove Date: Tue Nov 24 19:20:24 2020 +0000 Fixed non-initialisation of in_use flag. commit 36cbf21cd1b67a28255582cfb4a188a601631ab2 Author: John Wellbelove Date: Tue Nov 24 18:52:53 2020 +0000 Refactor buffer_descriptors test commit 49c60add63153bf53f400a891d8c4fb880cacda8 Author: John Wellbelove Date: Tue Nov 24 18:44:42 2020 +0000 Refactor buffer_descriptors test commit 7bda7678311bf2eb497483f3ef27c3af9211680b Author: John Wellbelove Date: Tue Nov 24 18:29:02 2020 +0000 Refactor buffer_descriptors test commit 7a68c932a7df05f66690fa63e67365cf4b0619e8 Author: John Wellbelove Date: Tue Nov 24 18:14:30 2020 +0000 Refactor buffer_descriptors test commit a9b25ac67d175f58751a2eb819f0e5822e8f0cf9 Author: John Wellbelove Date: Tue Nov 24 18:08:21 2020 +0000 Refactor buffer_descriptors test commit 0c721c0466733751708fcbd995ce0bc1d7c0a932 Author: John Wellbelove Date: Tue Nov 24 17:58:22 2020 +0000 Refactor buffer_descriptors test commit 4b2dd2fce22cd0a4846b95695fbfd812e0823540 Author: John Wellbelove Date: Tue Nov 24 17:47:43 2020 +0000 Refactor buffer_descriptors test commit 80d5776c409b416377269d543bd539bdad83dc86 Author: John Wellbelove Date: Tue Nov 24 17:32:27 2020 +0000 Refactor buffer_descriptors test commit 3564ac5b7ef89c41b240d9f54fce36042408daa0 Author: John Wellbelove Date: Tue Nov 24 17:17:50 2020 +0000 Refactor buffer_descriptors test commit 297ef42c60e4228bfbcb2adcddeb6b8a617c4113 Author: John Wellbelove Date: Tue Nov 24 17:08:45 2020 +0000 Refactor buffer_descriptors test commit 658d592c96eb7eaf1afb5d09fef38e293ea6f79b Author: John Wellbelove Date: Tue Nov 24 16:58:52 2020 +0000 Refactor buffer_descriptors test commit e97d8f90d5527349324ea84fd578c1d879d7a5a4 Author: John Wellbelove Date: Tue Nov 24 16:48:52 2020 +0000 Refactor buffer_descriptors test commit ed783a8ccccc8673c0f55eb1780c08668880a745 Author: John Wellbelove Date: Tue Nov 24 16:43:52 2020 +0000 clang.yml hack for testing commit e939e6b15557544bd0bb88d9862b5d5711170859 Author: John Wellbelove Date: Tue Nov 24 16:47:40 2020 +0000 Refactor buffer_descriptors test commit 4c4149abf6221f245aa4d73eb85e50319e7bd32c Author: John Wellbelove Date: Tue Nov 24 16:45:53 2020 +0000 clang hack for testing * Added AVR compile time switch * Updated version numbers * Fixed AVR to __AVR__ * Fixed version number retrieval from Github * constexpr, template aliases and inline variables * Updated version numbers * Added ETL_ASSERT for out-of-order state list. * issue-314-constexpr * issue-314-constexpr * Make modifying constexpr C++14 only * Make modifying constexpr C++14 only * Removed double subtraction of float size from 'bits_remaining' for floating point reads * Added parameterised constructor for etl::format_spec * Updated version numbers * Include new on megaAVR Boards (Arduino Nano Every) (#313) * Change new to new.h * Only include header if ETL supports STL * Adding a flag to define placement new if necessary Co-authored-by: Heinz-Peter Liechtenecker * Minor changes * Added clang mutex header redirect to GCC implementation * Updated for automatic detection of or * Updated generators * Updated generators * Merge branch 'hotfix/issue-303-etl-not-compatible-with-arduino-ide' into development # Conflicts: # support/Release notes.txt # test/vs2019/etl.vcxproj.filters * Make span std compliant (#317) * add missing overloads for span::first + span::last The C++20 standard defines additional overloads for first and last: template< std::size_t Count > constexpr std::span first() const; constexpr std::span first( size_type Count ) const; template< std::size_t Count > constexpr std::span last() const; constexpr std::span last( size_type Count ) const; etl implements only the first (= template) variants so far. To be able to compile valid C++20 code the missing overload should be added. * remove explicit specifier for span conversion operator The C++20 standard allows to assign a span of non-const elements to a span of const elements. Example: std::span cintspan; std::span intspan; cintspan = intspan; This is enabled in the STL by using an explicit specifier with a constant expression for one of the conversion constructors: template< class R > explicit(extent != std::dynamic_extent) constexpr span( R&& r ); The explicit specifier together with a constant expression is a C++20 feature and therefore can't be used within etl. To be able to compile valid C++20 code which uses the conversion on assignment, the explicit specifier has to be removed. * remove explicit specifier for span conversion operator The C++20 standard allows to assign an array of elements directly (without explicitly using a conversion constructor). Example: const int data = { 1, 2, 3 }; std::span cintspan; cintspan = data; To be able to compile valid C++20 code which uses the conversion on assignment, the explicit specifier of the array-conversion constructor has to be removed. * Updated version numbers * Change std::move to etl::move in etl::forward_list * Create Arduino ZIP * Fcs make getter const (#319) * make FCS get and conversion-operator methods const etl::frame_check_sequence has to access methods which can be made const: value_type value() const operator value_type() const * make jenkins_policy::initial and final const According to the documentation, initial, add and const have to be tagged as const. final has to be const now due to the change in the previous commit which makes the fcs getter methods const. * let default assignment operator return a reference to itself (#320) The default assignment operator in C++ shall return a reference to *this. * Arduino compatibility * Arduino compatibility * Updated version numbers * Merge branch 'hotfix/fcs_make_getter_const' into development * Arduino compatibility * VS2019 Delegate function interrupt service example * Removed unused functions * Added is_random_access_iterator and deprecated is_random_iterator * Interim commit * Added etl::for_each * Added etl::multi_loop * etl::multi_loop implementation * Added etl::multi_loop * Added typedefs * Latest implementation * Refactor multi_loop to multi_range * Moved code lines * Interim commit * Interim commit Refactor of reference counted types. * Merged shared_message handlers into message_router * reference_counted_object and reference_counted_message specialisations * reference_counted_object and reference_counted_message specialisations * reference_counted_object and reference_counted_message specialisations * Unknown board is not an error * Refactored reference_counted_message now contains owner reference * Added fixed_sized_memory_block_pool and restored imemory_block_pool interface * message router changes * Fixed LGT8F macro name clash * Updated generators * Updated deque from development * get_memory_block_size() const * Updates to pools and memory allocators * LLVM changes * Ongoing addition of unit tests * Added final unit tests * Added static asserts * Renamed internal structure * Minor updates. * Added virtual function 'void on_task_added()' that is called when a task is added to a shceduler. * Added virtual function 'void on_task_added()' that is called when a task is added to a scheduler. * Update version number * Removed pool_message and non_pool_message * Added shared_message example * Added shared_message receive override to messge_bus * Added shared_message example * Added memory allocator successor * Added reference_counted_message specialisation for void counter * Added lock/unlock interface * Added lock/unlock example * Added constructors with deleters for unique_ptr. * Fixed typos in rvalue constructor * Added ilockable interface class * Fixed VS2019 warning for etl::deque iterators. * Added nullptr check to unique_ptr destructor * Added nullptr check to unique_ptr destructor. * Added nullptr check to unique_ptr destructor. * Added ilockable interface & queue_lockable * Added nullptr check to unique_ptr destructor. * Typo in unique_ptr * Refactored queues * Added virtual destructor to observer. Changed C++11 destructors to '= default'. * Updated version and release notes. * Added more CMakeLists.txt files for examples * Added enable_if for container iterator costructors, to exclude integrals from consideration * Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Squashed commit of the following: commit 6107c4538be149137209d85e5f41031291bc7150 Author: John Wellbelove Date: Tue Feb 2 12:15:31 2021 +0000 Added move constructor and move assignment to etl::shared_message commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Squashed commit of the following: commit 007b56d03513887636b84fc246e57d6c4f8b777e Author: John Wellbelove Date: Tue Feb 2 18:09:51 2021 +0000 Squashed commit of the following: commit 6107c4538be149137209d85e5f41031291bc7150 Author: John Wellbelove Date: Tue Feb 2 12:15:31 2021 +0000 Added move constructor and move assignment to etl::shared_message commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Squashed commit of the following: commit 04ba91bcccc8e12867962bc3746665f430672a23 Author: John Wellbelove Date: Sat Feb 6 10:43:34 2021 +0000 Updated shared message unit test commit fababc5cf748073464b4294a50c201cb0aa4fa13 Author: John Wellbelove Date: Fri Feb 5 09:41:52 2021 +0000 Updated FSM generator commit ff287bcf0a833ca70933354b42b8b036b422ff81 Author: John Wellbelove Date: Fri Feb 5 09:35:56 2021 +0000 Updated message router generator commit 52724e1e62b55dad81e2f80dd656026d828b3214 Author: John Wellbelove Date: Thu Feb 4 13:06:50 2021 +0000 Updated unit tests commit 0d89105262aa050577ccc17ddc6eece9f4fc5d18 Author: John Wellbelove Date: Tue Feb 2 20:09:35 2021 +0000 Interim commit commit ce8385ff24826103c7a55267ccf3f8a31f517e0b Author: John Wellbelove Date: Tue Feb 2 18:13:29 2021 +0000 Squashed commit of the following: commit 007b56d03513887636b84fc246e57d6c4f8b777e Author: John Wellbelove Date: Tue Feb 2 18:09:51 2021 +0000 Squashed commit of the following: commit 6107c4538be149137209d85e5f41031291bc7150 Author: John Wellbelove Date: Tue Feb 2 12:15:31 2021 +0000 Added move constructor and move assignment to etl::shared_message commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Squashed commit of the following: commit 97a6e6a03557359442123d439cef9bdf6dea2d1b Author: John Wellbelove Date: Sun Feb 7 11:02:49 2021 +0000 Squashed commit of the following: commit 04ba91bcccc8e12867962bc3746665f430672a23 Author: John Wellbelove Date: Sat Feb 6 10:43:34 2021 +0000 Updated shared message unit test commit fababc5cf748073464b4294a50c201cb0aa4fa13 Author: John Wellbelove Date: Fri Feb 5 09:41:52 2021 +0000 Updated FSM generator commit ff287bcf0a833ca70933354b42b8b036b422ff81 Author: John Wellbelove Date: Fri Feb 5 09:35:56 2021 +0000 Updated message router generator commit 52724e1e62b55dad81e2f80dd656026d828b3214 Author: John Wellbelove Date: Thu Feb 4 13:06:50 2021 +0000 Updated unit tests commit 0d89105262aa050577ccc17ddc6eece9f4fc5d18 Author: John Wellbelove Date: Tue Feb 2 20:09:35 2021 +0000 Interim commit commit ce8385ff24826103c7a55267ccf3f8a31f517e0b Author: John Wellbelove Date: Tue Feb 2 18:13:29 2021 +0000 Squashed commit of the following: commit 007b56d03513887636b84fc246e57d6c4f8b777e Author: John Wellbelove Date: Tue Feb 2 18:09:51 2021 +0000 Squashed commit of the following: commit 6107c4538be149137209d85e5f41031291bc7150 Author: John Wellbelove Date: Tue Feb 2 12:15:31 2021 +0000 Added move constructor and move assignment to etl::shared_message commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit 007b56d03513887636b84fc246e57d6c4f8b777e Author: John Wellbelove Date: Tue Feb 2 18:09:51 2021 +0000 Squashed commit of the following: commit 6107c4538be149137209d85e5f41031291bc7150 Author: John Wellbelove Date: Tue Feb 2 12:15:31 2021 +0000 Added move constructor and move assignment to etl::shared_message commit c9a5716012db9b614ea67660ebf64dcb790ce571 Author: John Wellbelove Date: Sun Jan 31 12:36:29 2021 +0000 Squashed commit of the following: commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example commit e5f4eb6fb38c337c82fcc250f17a8f21eb788975 Author: John Wellbelove Date: Sun Jan 31 12:34:49 2021 +0000 Squashed commit of the following: commit 23c5f1d3f9b13ff9e46ce3de96aefeb655d5ed97 Author: John Wellbelove Date: Sun Jan 31 12:32:35 2021 +0000 Fixed rollover error for etl::queue_spsc_atomic Added 'required_alignment' parameter to 'allocate' for etl::imemeory_block_allocator. Updated QueuedMessageRouter example * Changed template aliases so they are available for C++11 rather than C++14. * Changed template aliases so they are available for C++11 rather than C++14. * Allow default constructed messages for shared messages * Updated version numbers * Modified reference_counted_message_pool::allocate() return type * Modified reference_counted_message_pool::allocate() return type * Added non-const get_message() member funtions in shared message framework. * Added update_size() to string API to fix string lengths after insertion of characters by C code. * Interface for C string handling. * Fixed indexing error in find_next for etl::bitset. Added some enum tests for type_traits * Updated version * fix bug in ibitset find_next method (#338) Co-authored-by: John Wellbelove * Merge branch 'hotfix/bitset-iteration-error' into development * Merge branch 'hotfix/Chiraffollo-fix-find_next' into development * Updated version * Fixed indexing error in find_next for etl::bitset. Added some enum tests for type_traits * Updated version * Merge branch 'hotfix/bitset-iteration-error' into development * fix bug in ibitset find_next method (#338) Co-authored-by: John Wellbelove * Merge branch 'hotfix/Chiraffollo-fix-find_next' into development * Updated version * Added data_end() and renamed trim() to trim_to_terminator() * Added ETL_CONSTANT to numeric_limits member functions. * Added uninitialized_resize() * Updated version numbers * Added uninitialized_resize() tests to external buffer containers * Updated example for shared_message * Updates to etl::shared_message example application. * Added specialisation of etl::state_chart that allows a parameter to be passed to the event handler. * Export headers as system includes (#340) Gcc doesn't apply warning to system includes paths. This change allows a project to use high warning levels without getting swamped by ETL issues. * Fix extent type conversion warning (#339) * Issue #339 - Fix extent type conversion warning * Merge branch 'feature/state-chart-to-have-optional-data-parameter' into development * Minor updates to state chart * Minor updates to state chart * Fix extent error in clang and gcc * Fix extent error in clang and gcc * Initial code * Fix C++14 only type aliases for STL * Fix C++14 only type aliases for STL * Fix C++14 only type aliases for STL * Fix C++14 only type aliases for STL * Abstracted unit test framework header * Initial commit * Added message_router_registry * Added message_router_registry * Added iterators * Added iterators * Changed to using etl::flat_multimap * Updates to message_router_registry * Remove executable permission on C++ source files (#341) * Updated * & -> operators. * Partial fix to compiling with C++98/03 (#342) * Updated version numbers * Fix default function templates for C++03 * Updated file id macros * Added ETL_CONSTEXPR to etl::array * Remove unnecessary template keyword to destroy() call. * Remove unnecessary template keyword to destroy() call. * Fix default function templates for C++03 * Correct use of ETL_NULLPTR instead for keyword nulllptr (#346) Gives problem in C++98/03 mode. * Remove etl/ prefix in state_chart.h (#347) It's the only file to include internal header files with "etl/... .h". * Add free-standing sanity tests for C++03/11/14/17 Co-authored-by: John Wellbelove Co-authored-by: Heinz-Peter Liechtenecker Co-authored-by: Heinz-Peter Liechtenecker Co-authored-by: Steffen Zimmermann Co-authored-by: Chiraffollo Co-authored-by: John Wellbelove Co-authored-by: Adam Boseley --- .circleci/config.yml | 32 +- .gitattributes | 5 + .github/FUNDING.yml | 3 + .github/workflows/clang.yml | 89 + .github/workflows/gcc.yml | 45 + .github/workflows/vs2019.yml | 51 + .gitignore | 35 + .vs/.gitignore | 1 - .vs/ProjectSettings.json | 3 - .vs/VSWorkspaceState.json | 10 - CMakeLists.txt | 49 +- CMakeSettings.json | 17 - README.md | 9 +- appveyor.yml | 7 +- arduino/Embedded_Template_Library.h | 80 + arduino/create_arduino_library.py | 72 + conanfile.py | 4 +- etl.ico | Bin 1150 -> 0 bytes etl.png | Bin 20267 -> 0 bytes etl.pspimage | Bin 11544 -> 0 bytes etl.xar | Bin 28896 -> 0 bytes etl16.png | Bin 15993 -> 0 bytes etl48.png | Bin 24217 -> 0 bytes .../ArmTimerCallbacks - C++/etl_profile.h | 2 +- examples/Debounce/Debounce.sln | 28 - examples/Debounce/Debounce.vcxproj.filters | 25 - .../CMakeLists.txt | 17 + .../FunctionInterruptSimulation-Delegates.sln | 31 + ...tionInterruptSimulation-Delegates.vcxproj} | 81 +- .../CMakeLists.txt | 17 + examples/QueuedFSM/CMakeLists.txt | 17 + examples/QueuedMessageRouter/CMakeLists.txt | 17 + .../QueuedMessageRouter.cpp | 17 +- .../{vs2017 => }/etl_profile.h | 6 +- .../vs2017/.vs/QueuedMessageRouter.sqlite | Bin 278528 -> 0 bytes .../QueuedMessageRouter.vcxproj.filters | 27 - .../QueuedMessageRouter.sln | 0 .../QueuedMessageRouter.vcxproj | 12 +- examples/Scheduler/CMakeLists.txt | 17 + examples/Scheduler/Scheduler.cpp | 184 + .../Scheduler}/etl_profile.h | 43 +- examples/Scheduler/vs2017/Scheduler.sln | 30 + examples/Scheduler/vs2017/Scheduler.vcxproj | 160 + examples/Scheduler/vs2019/Scheduler.sln | 30 + examples/Scheduler/vs2019/Scheduler.vcxproj | 160 + examples/SharedMessage/CMakeLists.txt | 17 + examples/SharedMessage/SharedMessage.cpp | 285 + examples/SharedMessage/SharedMessage.sln | 31 + examples/SharedMessage/SharedMessage.vcxproj | 165 + .../SharedMessage.vcxproj.filters | 66 + examples/SharedMessage/etl_profile.h | 0 favicon.ico | Bin 1150 -> 0 bytes file.txt | 0 images/etl-round.png | Bin 0 -> 33955 bytes images/etl.pspimage | Bin 11544 -> 0 bytes images/etl64.png | Bin 0 -> 2047 bytes etl32.png => images/favicon-32.png | Bin images/favicon-64.png | Bin 0 -> 2047 bytes include/etl/absolute.h | 4 +- include/etl/algorithm.h | 354 +- include/etl/alignment.h | 16 +- include/etl/array.h | 60 +- include/etl/array_view.h | 90 +- include/etl/array_wrapper.h | 7 +- include/etl/atomic.h | 6 +- include/etl/atomic/atomic_clang_sync.h | 34 + include/etl/atomic/atomic_gcc_sync.h | 48 +- include/etl/atomic/atomic_llvm_sync.h | 785 - include/etl/atomic/atomic_std.h | 15 +- include/etl/basic_format_spec.h | 295 +- include/etl/basic_string.h | 438 +- include/etl/basic_string_stream.h | 269 + include/etl/binary.h | 70 +- include/etl/bit_stream.h | 36 +- include/etl/bitset.h | 43 +- include/etl/bloom_filter.h | 2 +- include/etl/bresenham_line.h | 361 + include/etl/buffer_descriptors.h | 293 + include/etl/callback_service.h | 4 +- include/etl/callback_timer.h | 13 +- include/etl/char_traits.h | 6 +- include/etl/circular_buffer.h | 1323 ++ include/etl/combinations.h | 7 +- include/etl/crc8_rohc.h | 2 +- include/etl/cstring.h | 280 +- include/etl/cumulative_moving_average.h | 117 +- include/etl/debug_count.h | 14 +- include/etl/delegate.h | 50 +- include/etl/deque.h | 277 +- include/etl/endianness.h | 4 +- include/etl/enum_type.h | 2 +- include/etl/error_handler.h | 202 +- include/etl/experimental/variant_new.h | 509 + include/etl/factorial.h | 9 +- include/etl/fibonacci.h | 11 +- include/etl/file_error_numbers.h | 95 + include/etl/file_error_numbers.txt | 55 - .../etl/fixed_sized_memory_block_allocator.h | 118 + include/etl/flags.h | 383 + include/etl/flat_map.h | 35 +- include/etl/flat_multimap.h | 47 +- include/etl/flat_multiset.h | 41 +- include/etl/flat_set.h | 29 +- include/etl/fnv_1.h | 2 +- include/etl/format_spec.h | 2 +- include/etl/forward_list.h | 279 +- include/etl/frame_check_sequence.h | 61 +- include/etl/fsm.h | 469 +- include/etl/function.h | 28 +- include/etl/functional.h | 229 +- include/etl/generate.bat | 8 - include/etl/generate_fsm.bat | 1 - include/etl/generate_largest.bat | 1 - include/etl/generate_message_packet.bat | 1 - include/etl/generate_message_router.bat | 1 - include/etl/generate_smallest.bat | 1 - include/etl/generate_type_lookup.bat | 1 - include/etl/generate_type_select.bat | 1 - include/etl/generate_type_traits.bat | 1 - include/etl/generate_variant_pool.bat | 1 - include/etl/{ => generators}/fsm_generator.h | 117 +- include/etl/generators/generate.bat | 8 + include/etl/generators/generate_fsm.bat | 1 + include/etl/generators/generate_largest.bat | 1 + .../generators/generate_message_packet.bat | 1 + .../generators/generate_message_router.bat | 1 + include/etl/generators/generate_smallest.bat | 1 + .../etl/generators/generate_type_lookup.bat | 1 + .../etl/generators/generate_type_select.bat | 1 + .../etl/generators/generate_type_traits.bat | 1 + .../etl/generators/generate_variant_pool.bat | 1 + .../etl/{ => generators}/largest_generator.h | 38 + .../message_packet_generator.h | 316 +- .../message_router_generator.h | 272 +- .../etl/{ => generators}/smallest_generator.h | 43 +- .../{ => generators}/type_lookup_generator.h | 158 +- .../{ => generators}/type_select_generator.h | 49 +- .../{ => generators}/type_traits_generator.h | 256 +- .../{ => generators}/variant_pool_generator.h | 39 +- include/etl/generic_pool.h | 201 + include/etl/hash.h | 2 +- include/etl/ihash.h | 7 +- include/etl/imemory_block_allocator.h | 112 + include/etl/indirect_vector.h | 65 +- include/etl/integral_limits.h | 1 + include/etl/intrusive_forward_list.h | 49 +- include/etl/intrusive_links.h | 128 +- include/etl/intrusive_list.h | 25 +- include/etl/intrusive_queue.h | 19 +- include/etl/intrusive_stack.h | 17 +- include/etl/io_port.h | 14 +- include/etl/ipool.h | 450 + include/etl/ireference_counted_message_pool.h | 73 + include/etl/iterator.h | 227 +- include/etl/jenkins.h | 6 +- include/etl/largest.h | 38 + include/etl/limits.h | 625 +- include/etl/list.h | 343 +- include/etl/log.h | 21 +- include/etl/map.h | 153 +- include/etl/math_constants.h | 20 +- include/etl/memory.h | 354 +- include/etl/message.h | 38 +- include/etl/message_bus.h | 172 +- include/etl/message_packet.h | 3066 ++- include/etl/message_router.h | 1170 +- include/etl/message_router_registry.h | 575 + include/etl/message_timer.h | 16 +- include/etl/multi_array.h | 18 +- include/etl/multi_range.h | 529 + include/etl/multimap.h | 128 +- include/etl/multiset.h | 125 +- include/etl/murmur3.h | 2 +- include/etl/mutex.h | 5 +- include/etl/mutex/mutex_clang_sync.h | 34 + include/etl/negative.h | 6 +- include/etl/null_type.h | 10 +- include/etl/nullptr.h | 63 +- include/etl/observer.h | 126 +- include/etl/optional.h | 10 +- include/etl/packet.h | 8 +- include/etl/parameter_pack.h | 124 + include/etl/permutations.h | 9 +- include/etl/placement_new.h | 48 + include/etl/platform.h | 147 +- include/etl/pool.h | 680 +- include/etl/power.h | 32 +- include/etl/priority_queue.h | 15 +- include/etl/private/choose_namespace.h | 2 +- include/etl/private/crc16_poly_0x1021_.h | 2 +- include/etl/private/crc16_poly_0x8005.h | 2 +- include/etl/private/crc32_poly_0x04c11db7.h | 2 +- include/etl/private/crc32_poly_0x1edc6f41.h | 6 +- .../private/crc64_poly_0x42f0e1eba9ea3693.h | 6 +- include/etl/private/crc8_poly_0x07.h | 34 +- include/etl/private/ivectorpointer.h | 134 +- include/etl/private/minmax_pop.h | 7 +- include/etl/private/minmax_push.h | 10 +- include/etl/private/pvoidvector.h | 137 +- include/etl/private/to_string_helper.h | 169 +- include/etl/private/vector_base.h | 13 +- include/etl/profiles/auto.h | 2 - include/etl/profiles/clang_generic.h | 15 +- include/etl/profiles/clang_generic_no_stl.h | 41 + include/etl/profiles/determine_compiler.h | 4 +- .../determine_compiler_language_support.h | 62 +- .../etl/profiles/determine_compiler_version.h | 2 + .../etl/profiles/determine_development_os.h | 83 + include/etl/profiles/gcc_generic.h | 13 - include/etl/profiles/gcc_generic_no_stl.h | 42 + include/etl/profiles/gcc_linux_x86.h | 13 - include/etl/profiles/gcc_linux_x86_no_stl.h | 42 + include/etl/profiles/gcc_windows_x86.h | 13 - include/etl/profiles/gcc_windows_x86_no_stl.h | 42 + include/etl/profiles/msvc_x86.h | 7 - include/etl/profiles/msvc_x86_no_stl.h | 42 + include/etl/profiles/segger_gcc_stlport.h | 3 +- include/etl/profiles/ticc.h | 1 - include/etl/profiles/ticc_no_stl.h | 48 + include/etl/queue.h | 18 +- include/etl/queue_lockable.h | 782 + include/etl/queue_mpmc_mutex.h | 57 +- include/etl/queue_spsc_atomic.h | 44 +- include/etl/queue_spsc_isr.h | 68 +- include/etl/queue_spsc_locked.h | 744 +- include/etl/random.h | 2 +- include/etl/ratio.h | 7 +- include/etl/reference_counted_message.h | 225 + include/etl/reference_counted_message_pool.h | 262 + include/etl/reference_counted_object.h | 250 + include/etl/reference_flat_map.h | 47 +- include/etl/reference_flat_multimap.h | 17 +- include/etl/reference_flat_multiset.h | 12 +- include/etl/reference_flat_set.h | 12 +- include/etl/scheduler.h | 41 +- include/etl/set.h | 146 +- include/etl/shared_message.h | 197 + include/etl/smallest.h | 43 +- include/etl/span.h | 360 + include/etl/sqrt.h | 13 +- include/etl/stack.h | 23 +- include/etl/state_chart.h | 417 +- include/etl/string.h | 495 + include/etl/string_stream.h | 48 + include/etl/string_utilities.h | 835 + include/etl/string_view.h | 62 +- include/etl/successor.h | 95 + include/etl/task.h | 15 +- include/etl/temp.h | 897 - include/etl/to_string.h | 68 +- include/etl/to_u16string.h | 64 +- include/etl/to_u32string.h | 64 +- include/etl/to_wstring.h | 64 +- include/etl/type_lookup.h | 158 +- include/etl/type_select.h | 49 +- include/etl/type_traits.h | 267 +- include/etl/u16string.h | 241 +- include/etl/u16string_stream.h | 48 + include/etl/u32string.h | 241 +- include/etl/u32string_stream.h | 48 + include/etl/unordered_map.h | 260 +- include/etl/unordered_multimap.h | 256 +- include/etl/unordered_multiset.h | 242 +- include/etl/unordered_set.h | 264 +- include/etl/utility.h | 84 +- include/etl/variant.h | 597 +- include/etl/variant_pool.h | 260 +- include/etl/vector.h | 254 +- include/etl/version.h | 6 +- include/etl/visitor.h | 100 +- include/etl/wstring.h | 234 +- include/etl/wstring_stream.h | 48 + library.json | 8 +- library.properties | 6 +- meson.build | 200 + support/Release notes.txt | 570 +- temp/fsm-patch.txt | 21 + test/.kdev4/test.kdev4 | 2 + test/CMakeLists.txt | 314 +- test/codeblocks/ETL.cbp | 102 +- test/cpp03sanity/CMakeLists.txt | 202 + test/cpp03sanity/absolute.h.t.cpp | 29 + test/cpp03sanity/algorithm.h.t.cpp | 29 + test/cpp03sanity/alignment.h.t.cpp | 29 + test/cpp03sanity/array.h.t.cpp | 29 + test/cpp03sanity/array_view.h.t.cpp | 29 + test/cpp03sanity/array_wrapper.h.t.cpp | 29 + test/cpp03sanity/atomic.h.t.cpp | 29 + test/cpp03sanity/basic_format_spec.h.t.cpp | 29 + test/cpp03sanity/basic_string.h.t.cpp | 29 + test/cpp03sanity/basic_string_stream.h.t.cpp | 29 + test/cpp03sanity/binary.h.t.cpp | 29 + test/cpp03sanity/bit_stream.h.t.cpp | 29 + test/cpp03sanity/bitset.h.t.cpp | 29 + test/cpp03sanity/bloom_filter.h.t.cpp | 29 + test/cpp03sanity/bresenham_line.h.t.cpp | 29 + test/cpp03sanity/buffer_descriptors.h.t.cpp | 29 + test/cpp03sanity/callback.h.t.cpp | 29 + test/cpp03sanity/callback_service.h.t.cpp | 29 + test/cpp03sanity/callback_timer.h.t.cpp | 29 + test/cpp03sanity/char_traits.h.t.cpp | 29 + test/cpp03sanity/checksum.h.t.cpp | 29 + test/cpp03sanity/circular_buffer.h.t.cpp | 29 + test/cpp03sanity/combinations.h.t.cpp | 29 + test/cpp03sanity/compare.h.t.cpp | 29 + test/cpp03sanity/constant.h.t.cpp | 29 + test/cpp03sanity/container.h.t.cpp | 29 + test/cpp03sanity/crc16.h.t.cpp | 29 + test/cpp03sanity/crc16_aug_ccitt.h.t.cpp | 29 + test/cpp03sanity/crc16_ccitt.h.t.cpp | 29 + test/cpp03sanity/crc16_genibus.h.t.cpp | 29 + test/cpp03sanity/crc16_kermit.h.t.cpp | 29 + test/cpp03sanity/crc16_modbus.h.t.cpp | 29 + test/cpp03sanity/crc16_usb.h.t.cpp | 29 + test/cpp03sanity/crc16_x25.h.t.cpp | 29 + test/cpp03sanity/crc16_xmodem.h.t.cpp | 29 + test/cpp03sanity/crc32.h.t.cpp | 29 + test/cpp03sanity/crc32_bzip2.h.t.cpp | 29 + test/cpp03sanity/crc32_c.h.t.cpp | 29 + test/cpp03sanity/crc32_mpeg2.h.t.cpp | 29 + test/cpp03sanity/crc32_posix.h.t.cpp | 29 + test/cpp03sanity/crc64_ecma.h.t.cpp | 29 + test/cpp03sanity/crc8_ccitt.h.t.cpp | 29 + test/cpp03sanity/crc8_rohc.h.t.cpp | 29 + test/cpp03sanity/cstring.h.t.cpp | 29 + .../cumulative_moving_average.h.t.cpp | 29 + test/cpp03sanity/cyclic_value.h.t.cpp | 29 + test/cpp03sanity/debounce.h.t.cpp | 29 + test/cpp03sanity/debug_count.h.t.cpp | 29 + test/cpp03sanity/delegate.h.t.cpp | 29 + test/cpp03sanity/delegate_service.h.t.cpp | 29 + test/cpp03sanity/deque.h.t.cpp | 29 + test/cpp03sanity/endianness.h.t.cpp | 29 + test/cpp03sanity/enum_type.h.t.cpp | 29 + test/cpp03sanity/error_handler.h.t.cpp | 29 + test/cpp03sanity/etl_profile.h | 34 + test/cpp03sanity/exception.h.t.cpp | 29 + test/cpp03sanity/factorial.h.t.cpp | 29 + test/cpp03sanity/fibonacci.h.t.cpp | 29 + test/cpp03sanity/file_error_numbers.h.t.cpp | 29 + test/cpp03sanity/fixed_iterator.h.t.cpp | 29 + ...fixed_sized_memory_block_allocator.h.t.cpp | 29 + test/cpp03sanity/flags.h.t.cpp | 29 + test/cpp03sanity/flat_map.h.t.cpp | 29 + test/cpp03sanity/flat_multimap.h.t.cpp | 29 + test/cpp03sanity/flat_multiset.h.t.cpp | 29 + test/cpp03sanity/flat_set.h.t.cpp | 29 + test/cpp03sanity/fnv_1.h.t.cpp | 29 + test/cpp03sanity/format_spec.h.t.cpp | 29 + test/cpp03sanity/forward_list.h.t.cpp | 29 + test/cpp03sanity/frame_check_sequence.h.t.cpp | 29 + test/cpp03sanity/fsm.h.t.cpp | 29 + test/cpp03sanity/function.h.t.cpp | 29 + test/cpp03sanity/functional.h.t.cpp | 29 + test/cpp03sanity/generic_pool.h.t.cpp | 29 + test/cpp03sanity/hash.h.t.cpp | 29 + test/cpp03sanity/ihash.h.t.cpp | 29 + .../imemory_block_allocator.h.t.cpp | 29 + test/cpp03sanity/indirect_vector.h.t.cpp | 29 + test/cpp03sanity/instance_count.h.t.cpp | 29 + test/cpp03sanity/integral_limits.h.t.cpp | 29 + .../intrusive_forward_list.h.t.cpp | 29 + test/cpp03sanity/intrusive_links.h.t.cpp | 29 + test/cpp03sanity/intrusive_list.h.t.cpp | 29 + test/cpp03sanity/intrusive_queue.h.t.cpp | 29 + test/cpp03sanity/intrusive_stack.h.t.cpp | 29 + test/cpp03sanity/io_port.h.t.cpp | 29 + test/cpp03sanity/ipool.h.t.cpp | 29 + .../ireference_counted_message_pool.h.t.cpp | 29 + test/cpp03sanity/iterator.h.t.cpp | 29 + test/cpp03sanity/jenkins.h.t.cpp | 29 + test/cpp03sanity/largest.h.t.cpp | 29 + test/cpp03sanity/limits.h.t.cpp | 29 + test/cpp03sanity/list.h.t.cpp | 29 + test/cpp03sanity/log.h.t.cpp | 29 + test/cpp03sanity/macros.h.t.cpp | 29 + test/cpp03sanity/map.h.t.cpp | 29 + test/cpp03sanity/math_constants.h.t.cpp | 29 + test/cpp03sanity/memory.h.t.cpp | 29 + test/cpp03sanity/memory_model.h.t.cpp | 29 + test/cpp03sanity/message.h.t.cpp | 29 + test/cpp03sanity/message_bus.h.t.cpp | 29 + test/cpp03sanity/message_packet.h.t.cpp | 29 + test/cpp03sanity/message_router.h.t.cpp | 29 + .../message_router_registry.h.t.cpp | 29 + test/cpp03sanity/message_timer.h.t.cpp | 29 + test/cpp03sanity/message_types.h.t.cpp | 29 + test/cpp03sanity/multi_array.h.t.cpp | 29 + test/cpp03sanity/multi_range.h.t.cpp | 29 + test/cpp03sanity/multimap.h.t.cpp | 29 + test/cpp03sanity/multiset.h.t.cpp | 29 + test/cpp03sanity/murmur3.h.t.cpp | 29 + test/cpp03sanity/mutex.h.t.cpp | 29 + test/cpp03sanity/negative.h.t.cpp | 29 + test/cpp03sanity/null_type.h.t.cpp | 29 + test/cpp03sanity/nullptr.h.t.cpp | 29 + test/cpp03sanity/numeric.h.t.cpp | 29 + test/cpp03sanity/observer.h.t.cpp | 29 + test/cpp03sanity/optional.h.t.cpp | 29 + test/cpp03sanity/packet.h.t.cpp | 29 + test/cpp03sanity/parameter_pack.h.t.cpp | 29 + test/cpp03sanity/parameter_type.h.t.cpp | 29 + test/cpp03sanity/pearson.h.t.cpp | 29 + test/cpp03sanity/permutations.h.t.cpp | 29 + test/cpp03sanity/placement_new.h.t.cpp | 29 + test/cpp03sanity/platform.h.t.cpp | 29 + test/cpp03sanity/pool.h.t.cpp | 29 + test/cpp03sanity/power.h.t.cpp | 29 + test/cpp03sanity/priority_queue.h.t.cpp | 29 + test/cpp03sanity/queue.h.t.cpp | 29 + test/cpp03sanity/queue_lockable.h.t.cpp | 29 + test/cpp03sanity/queue_mpmc_mutex.h.t.cpp | 29 + test/cpp03sanity/queue_spsc_atomic.h.t.cpp | 29 + test/cpp03sanity/queue_spsc_isr.h.t.cpp | 29 + test/cpp03sanity/queue_spsc_locked.h.t.cpp | 29 + test/cpp03sanity/radix.h.t.cpp | 29 + test/cpp03sanity/random.h.t.cpp | 29 + test/cpp03sanity/ratio.h.t.cpp | 29 + .../reference_counted_message.h.t.cpp | 29 + .../reference_counted_message_pool.h.t.cpp | 29 + .../reference_counted_object.h.t.cpp | 29 + test/cpp03sanity/reference_flat_map.h.t.cpp | 29 + .../reference_flat_multimap.h.t.cpp | 29 + .../reference_flat_multiset.h.t.cpp | 29 + test/cpp03sanity/reference_flat_set.h.t.cpp | 29 + test/cpp03sanity/scaled_rounding.h.t.cpp | 29 + test/cpp03sanity/scheduler.h.t.cpp | 29 + test/cpp03sanity/set.h.t.cpp | 29 + test/cpp03sanity/shared_message.h.t.cpp | 29 + test/cpp03sanity/smallest.h.t.cpp | 29 + test/cpp03sanity/span.h.t.cpp | 29 + test/cpp03sanity/spsc_queue.h.t.cpp | 29 + test/cpp03sanity/sqrt.h.t.cpp | 29 + test/cpp03sanity/stack.h.t.cpp | 29 + test/cpp03sanity/state_chart.h.t.cpp | 29 + test/cpp03sanity/static_assert.h.t.cpp | 29 + test/cpp03sanity/string.h.t.cpp | 29 + test/cpp03sanity/string_stream.h.t.cpp | 29 + test/cpp03sanity/string_utilities.h.t.cpp | 29 + test/cpp03sanity/string_view.h.t.cpp | 29 + test/cpp03sanity/successor.h.t.cpp | 29 + test/cpp03sanity/task.h.t.cpp | 29 + test/cpp03sanity/timer.h.t.cpp | 29 + test/cpp03sanity/to_string.h.t.cpp | 29 + test/cpp03sanity/to_u16string.h.t.cpp | 29 + test/cpp03sanity/to_u32string.h.t.cpp | 29 + test/cpp03sanity/to_wstring.h.t.cpp | 29 + test/cpp03sanity/type_def.h.t.cpp | 29 + test/cpp03sanity/type_lookup.h.t.cpp | 29 + test/cpp03sanity/type_select.h.t.cpp | 29 + test/cpp03sanity/type_traits.h.t.cpp | 29 + test/cpp03sanity/u16format_spec.h.t.cpp | 29 + test/cpp03sanity/u16string.h.t.cpp | 29 + test/cpp03sanity/u16string_stream.h.t.cpp | 29 + test/cpp03sanity/u32format_spec.h.t.cpp | 29 + test/cpp03sanity/u32string.h.t.cpp | 29 + test/cpp03sanity/u32string_stream.h.t.cpp | 29 + test/cpp03sanity/unordered_map.h.t.cpp | 29 + test/cpp03sanity/unordered_multimap.h.t.cpp | 29 + test/cpp03sanity/unordered_multiset.h.t.cpp | 29 + test/cpp03sanity/unordered_set.h.t.cpp | 29 + test/cpp03sanity/user_type.h.t.cpp | 29 + test/cpp03sanity/utility.h.t.cpp | 29 + test/cpp03sanity/variant.h.t.cpp | 29 + test/cpp03sanity/variant_pool.h.t.cpp | 29 + test/cpp03sanity/vector.h.t.cpp | 29 + test/cpp03sanity/version.h.t.cpp | 29 + test/cpp03sanity/visitor.h.t.cpp | 29 + test/cpp03sanity/wformat_spec.h.t.cpp | 29 + test/cpp03sanity/wstring.h.t.cpp | 29 + test/cpp03sanity/wstring_stream.h.t.cpp | 29 + test/cpp11sanity/CMakeLists.txt | 202 + test/cpp11sanity/absolute.h.t.cpp | 29 + test/cpp11sanity/algorithm.h.t.cpp | 29 + test/cpp11sanity/alignment.h.t.cpp | 29 + test/cpp11sanity/array.h.t.cpp | 29 + test/cpp11sanity/array_view.h.t.cpp | 29 + test/cpp11sanity/array_wrapper.h.t.cpp | 29 + test/cpp11sanity/atomic.h.t.cpp | 29 + test/cpp11sanity/basic_format_spec.h.t.cpp | 29 + test/cpp11sanity/basic_string.h.t.cpp | 29 + test/cpp11sanity/basic_string_stream.h.t.cpp | 29 + test/cpp11sanity/binary.h.t.cpp | 29 + test/cpp11sanity/bit_stream.h.t.cpp | 29 + test/cpp11sanity/bitset.h.t.cpp | 29 + test/cpp11sanity/bloom_filter.h.t.cpp | 29 + test/cpp11sanity/bresenham_line.h.t.cpp | 29 + test/cpp11sanity/buffer_descriptors.h.t.cpp | 29 + test/cpp11sanity/callback.h.t.cpp | 29 + test/cpp11sanity/callback_service.h.t.cpp | 29 + test/cpp11sanity/callback_timer.h.t.cpp | 29 + test/cpp11sanity/char_traits.h.t.cpp | 29 + test/cpp11sanity/checksum.h.t.cpp | 29 + test/cpp11sanity/circular_buffer.h.t.cpp | 29 + test/cpp11sanity/combinations.h.t.cpp | 29 + test/cpp11sanity/compare.h.t.cpp | 29 + test/cpp11sanity/constant.h.t.cpp | 29 + test/cpp11sanity/container.h.t.cpp | 29 + test/cpp11sanity/crc16.h.t.cpp | 29 + test/cpp11sanity/crc16_aug_ccitt.h.t.cpp | 29 + test/cpp11sanity/crc16_ccitt.h.t.cpp | 29 + test/cpp11sanity/crc16_genibus.h.t.cpp | 29 + test/cpp11sanity/crc16_kermit.h.t.cpp | 29 + test/cpp11sanity/crc16_modbus.h.t.cpp | 29 + test/cpp11sanity/crc16_usb.h.t.cpp | 29 + test/cpp11sanity/crc16_x25.h.t.cpp | 29 + test/cpp11sanity/crc16_xmodem.h.t.cpp | 29 + test/cpp11sanity/crc32.h.t.cpp | 29 + test/cpp11sanity/crc32_bzip2.h.t.cpp | 29 + test/cpp11sanity/crc32_c.h.t.cpp | 29 + test/cpp11sanity/crc32_mpeg2.h.t.cpp | 29 + test/cpp11sanity/crc32_posix.h.t.cpp | 29 + test/cpp11sanity/crc64_ecma.h.t.cpp | 29 + test/cpp11sanity/crc8_ccitt.h.t.cpp | 29 + test/cpp11sanity/crc8_rohc.h.t.cpp | 29 + test/cpp11sanity/cstring.h.t.cpp | 29 + .../cumulative_moving_average.h.t.cpp | 29 + test/cpp11sanity/cyclic_value.h.t.cpp | 29 + test/cpp11sanity/debounce.h.t.cpp | 29 + test/cpp11sanity/debug_count.h.t.cpp | 29 + test/cpp11sanity/delegate.h.t.cpp | 29 + test/cpp11sanity/delegate_service.h.t.cpp | 29 + test/cpp11sanity/deque.h.t.cpp | 29 + test/cpp11sanity/endianness.h.t.cpp | 29 + test/cpp11sanity/enum_type.h.t.cpp | 29 + test/cpp11sanity/error_handler.h.t.cpp | 29 + test/cpp11sanity/etl_profile.h | 34 + test/cpp11sanity/exception.h.t.cpp | 29 + test/cpp11sanity/factorial.h.t.cpp | 29 + test/cpp11sanity/fibonacci.h.t.cpp | 29 + test/cpp11sanity/file_error_numbers.h.t.cpp | 29 + test/cpp11sanity/fixed_iterator.h.t.cpp | 29 + ...fixed_sized_memory_block_allocator.h.t.cpp | 29 + test/cpp11sanity/flags.h.t.cpp | 29 + test/cpp11sanity/flat_map.h.t.cpp | 29 + test/cpp11sanity/flat_multimap.h.t.cpp | 29 + test/cpp11sanity/flat_multiset.h.t.cpp | 29 + test/cpp11sanity/flat_set.h.t.cpp | 29 + test/cpp11sanity/fnv_1.h.t.cpp | 29 + test/cpp11sanity/format_spec.h.t.cpp | 29 + test/cpp11sanity/forward_list.h.t.cpp | 29 + test/cpp11sanity/frame_check_sequence.h.t.cpp | 29 + test/cpp11sanity/fsm.h.t.cpp | 29 + test/cpp11sanity/function.h.t.cpp | 29 + test/cpp11sanity/functional.h.t.cpp | 29 + test/cpp11sanity/generic_pool.h.t.cpp | 29 + test/cpp11sanity/hash.h.t.cpp | 29 + test/cpp11sanity/ihash.h.t.cpp | 29 + .../imemory_block_allocator.h.t.cpp | 29 + test/cpp11sanity/indirect_vector.h.t.cpp | 29 + test/cpp11sanity/instance_count.h.t.cpp | 29 + test/cpp11sanity/integral_limits.h.t.cpp | 29 + .../intrusive_forward_list.h.t.cpp | 29 + test/cpp11sanity/intrusive_links.h.t.cpp | 29 + test/cpp11sanity/intrusive_list.h.t.cpp | 29 + test/cpp11sanity/intrusive_queue.h.t.cpp | 29 + test/cpp11sanity/intrusive_stack.h.t.cpp | 29 + test/cpp11sanity/io_port.h.t.cpp | 29 + test/cpp11sanity/ipool.h.t.cpp | 29 + .../ireference_counted_message_pool.h.t.cpp | 29 + test/cpp11sanity/iterator.h.t.cpp | 29 + test/cpp11sanity/jenkins.h.t.cpp | 29 + test/cpp11sanity/largest.h.t.cpp | 29 + test/cpp11sanity/limits.h.t.cpp | 29 + test/cpp11sanity/list.h.t.cpp | 29 + test/cpp11sanity/log.h.t.cpp | 29 + test/cpp11sanity/macros.h.t.cpp | 29 + test/cpp11sanity/map.h.t.cpp | 29 + test/cpp11sanity/math_constants.h.t.cpp | 29 + test/cpp11sanity/memory.h.t.cpp | 29 + test/cpp11sanity/memory_model.h.t.cpp | 29 + test/cpp11sanity/message.h.t.cpp | 29 + test/cpp11sanity/message_bus.h.t.cpp | 29 + test/cpp11sanity/message_packet.h.t.cpp | 29 + test/cpp11sanity/message_router.h.t.cpp | 29 + .../message_router_registry.h.t.cpp | 29 + test/cpp11sanity/message_timer.h.t.cpp | 29 + test/cpp11sanity/message_types.h.t.cpp | 29 + test/cpp11sanity/multi_array.h.t.cpp | 29 + test/cpp11sanity/multi_range.h.t.cpp | 29 + test/cpp11sanity/multimap.h.t.cpp | 29 + test/cpp11sanity/multiset.h.t.cpp | 29 + test/cpp11sanity/murmur3.h.t.cpp | 29 + test/cpp11sanity/mutex.h.t.cpp | 29 + test/cpp11sanity/negative.h.t.cpp | 29 + test/cpp11sanity/null_type.h.t.cpp | 29 + test/cpp11sanity/nullptr.h.t.cpp | 29 + test/cpp11sanity/numeric.h.t.cpp | 29 + test/cpp11sanity/observer.h.t.cpp | 29 + test/cpp11sanity/optional.h.t.cpp | 29 + test/cpp11sanity/packet.h.t.cpp | 29 + test/cpp11sanity/parameter_pack.h.t.cpp | 29 + test/cpp11sanity/parameter_type.h.t.cpp | 29 + test/cpp11sanity/pearson.h.t.cpp | 29 + test/cpp11sanity/permutations.h.t.cpp | 29 + test/cpp11sanity/placement_new.h.t.cpp | 29 + test/cpp11sanity/platform.h.t.cpp | 29 + test/cpp11sanity/pool.h.t.cpp | 29 + test/cpp11sanity/power.h.t.cpp | 29 + test/cpp11sanity/priority_queue.h.t.cpp | 29 + test/cpp11sanity/queue.h.t.cpp | 29 + test/cpp11sanity/queue_lockable.h.t.cpp | 29 + test/cpp11sanity/queue_mpmc_mutex.h.t.cpp | 29 + test/cpp11sanity/queue_spsc_atomic.h.t.cpp | 29 + test/cpp11sanity/queue_spsc_isr.h.t.cpp | 29 + test/cpp11sanity/queue_spsc_locked.h.t.cpp | 29 + test/cpp11sanity/radix.h.t.cpp | 29 + test/cpp11sanity/random.h.t.cpp | 29 + test/cpp11sanity/ratio.h.t.cpp | 29 + .../reference_counted_message.h.t.cpp | 29 + .../reference_counted_message_pool.h.t.cpp | 29 + .../reference_counted_object.h.t.cpp | 29 + test/cpp11sanity/reference_flat_map.h.t.cpp | 29 + .../reference_flat_multimap.h.t.cpp | 29 + .../reference_flat_multiset.h.t.cpp | 29 + test/cpp11sanity/reference_flat_set.h.t.cpp | 29 + test/cpp11sanity/scaled_rounding.h.t.cpp | 29 + test/cpp11sanity/scheduler.h.t.cpp | 29 + test/cpp11sanity/set.h.t.cpp | 29 + test/cpp11sanity/shared_message.h.t.cpp | 29 + test/cpp11sanity/smallest.h.t.cpp | 29 + test/cpp11sanity/span.h.t.cpp | 29 + test/cpp11sanity/spsc_queue.h.t.cpp | 29 + test/cpp11sanity/sqrt.h.t.cpp | 29 + test/cpp11sanity/stack.h.t.cpp | 29 + test/cpp11sanity/state_chart.h.t.cpp | 29 + test/cpp11sanity/static_assert.h.t.cpp | 29 + test/cpp11sanity/string.h.t.cpp | 29 + test/cpp11sanity/string_stream.h.t.cpp | 29 + test/cpp11sanity/string_utilities.h.t.cpp | 29 + test/cpp11sanity/string_view.h.t.cpp | 29 + test/cpp11sanity/successor.h.t.cpp | 29 + test/cpp11sanity/task.h.t.cpp | 29 + test/cpp11sanity/timer.h.t.cpp | 29 + test/cpp11sanity/to_string.h.t.cpp | 29 + test/cpp11sanity/to_u16string.h.t.cpp | 29 + test/cpp11sanity/to_u32string.h.t.cpp | 29 + test/cpp11sanity/to_wstring.h.t.cpp | 29 + test/cpp11sanity/type_def.h.t.cpp | 29 + test/cpp11sanity/type_lookup.h.t.cpp | 29 + test/cpp11sanity/type_select.h.t.cpp | 29 + test/cpp11sanity/type_traits.h.t.cpp | 29 + test/cpp11sanity/u16format_spec.h.t.cpp | 29 + test/cpp11sanity/u16string.h.t.cpp | 29 + test/cpp11sanity/u16string_stream.h.t.cpp | 29 + test/cpp11sanity/u32format_spec.h.t.cpp | 29 + test/cpp11sanity/u32string.h.t.cpp | 29 + test/cpp11sanity/u32string_stream.h.t.cpp | 29 + test/cpp11sanity/unordered_map.h.t.cpp | 29 + test/cpp11sanity/unordered_multimap.h.t.cpp | 29 + test/cpp11sanity/unordered_multiset.h.t.cpp | 29 + test/cpp11sanity/unordered_set.h.t.cpp | 29 + test/cpp11sanity/user_type.h.t.cpp | 29 + test/cpp11sanity/utility.h.t.cpp | 29 + test/cpp11sanity/variant.h.t.cpp | 29 + test/cpp11sanity/variant_pool.h.t.cpp | 29 + test/cpp11sanity/vector.h.t.cpp | 29 + test/cpp11sanity/version.h.t.cpp | 29 + test/cpp11sanity/visitor.h.t.cpp | 29 + test/cpp11sanity/wformat_spec.h.t.cpp | 29 + test/cpp11sanity/wstring.h.t.cpp | 29 + test/cpp11sanity/wstring_stream.h.t.cpp | 29 + test/cpp14sanity/CMakeLists.txt | 202 + test/cpp14sanity/absolute.h.t.cpp | 29 + test/cpp14sanity/algorithm.h.t.cpp | 29 + test/cpp14sanity/alignment.h.t.cpp | 29 + test/cpp14sanity/array.h.t.cpp | 29 + test/cpp14sanity/array_view.h.t.cpp | 29 + test/cpp14sanity/array_wrapper.h.t.cpp | 29 + test/cpp14sanity/atomic.h.t.cpp | 29 + test/cpp14sanity/basic_format_spec.h.t.cpp | 29 + test/cpp14sanity/basic_string.h.t.cpp | 29 + test/cpp14sanity/basic_string_stream.h.t.cpp | 29 + test/cpp14sanity/binary.h.t.cpp | 29 + test/cpp14sanity/bit_stream.h.t.cpp | 29 + test/cpp14sanity/bitset.h.t.cpp | 29 + test/cpp14sanity/bloom_filter.h.t.cpp | 29 + test/cpp14sanity/bresenham_line.h.t.cpp | 29 + test/cpp14sanity/buffer_descriptors.h.t.cpp | 29 + test/cpp14sanity/callback.h.t.cpp | 29 + test/cpp14sanity/callback_service.h.t.cpp | 29 + test/cpp14sanity/callback_timer.h.t.cpp | 29 + test/cpp14sanity/char_traits.h.t.cpp | 29 + test/cpp14sanity/checksum.h.t.cpp | 29 + test/cpp14sanity/circular_buffer.h.t.cpp | 29 + test/cpp14sanity/combinations.h.t.cpp | 29 + test/cpp14sanity/compare.h.t.cpp | 29 + test/cpp14sanity/constant.h.t.cpp | 29 + test/cpp14sanity/container.h.t.cpp | 29 + test/cpp14sanity/crc16.h.t.cpp | 29 + test/cpp14sanity/crc16_aug_ccitt.h.t.cpp | 29 + test/cpp14sanity/crc16_ccitt.h.t.cpp | 29 + test/cpp14sanity/crc16_genibus.h.t.cpp | 29 + test/cpp14sanity/crc16_kermit.h.t.cpp | 29 + test/cpp14sanity/crc16_modbus.h.t.cpp | 29 + test/cpp14sanity/crc16_usb.h.t.cpp | 29 + test/cpp14sanity/crc16_x25.h.t.cpp | 29 + test/cpp14sanity/crc16_xmodem.h.t.cpp | 29 + test/cpp14sanity/crc32.h.t.cpp | 29 + test/cpp14sanity/crc32_bzip2.h.t.cpp | 29 + test/cpp14sanity/crc32_c.h.t.cpp | 29 + test/cpp14sanity/crc32_mpeg2.h.t.cpp | 29 + test/cpp14sanity/crc32_posix.h.t.cpp | 29 + test/cpp14sanity/crc64_ecma.h.t.cpp | 29 + test/cpp14sanity/crc8_ccitt.h.t.cpp | 29 + test/cpp14sanity/crc8_rohc.h.t.cpp | 29 + test/cpp14sanity/cstring.h.t.cpp | 29 + .../cumulative_moving_average.h.t.cpp | 29 + test/cpp14sanity/cyclic_value.h.t.cpp | 29 + test/cpp14sanity/debounce.h.t.cpp | 29 + test/cpp14sanity/debug_count.h.t.cpp | 29 + test/cpp14sanity/delegate.h.t.cpp | 29 + test/cpp14sanity/delegate_service.h.t.cpp | 29 + test/cpp14sanity/deque.h.t.cpp | 29 + test/cpp14sanity/endianness.h.t.cpp | 29 + test/cpp14sanity/enum_type.h.t.cpp | 29 + test/cpp14sanity/error_handler.h.t.cpp | 29 + test/cpp14sanity/etl_profile.h | 34 + test/cpp14sanity/exception.h.t.cpp | 29 + test/cpp14sanity/factorial.h.t.cpp | 29 + test/cpp14sanity/fibonacci.h.t.cpp | 29 + test/cpp14sanity/file_error_numbers.h.t.cpp | 29 + test/cpp14sanity/fixed_iterator.h.t.cpp | 29 + ...fixed_sized_memory_block_allocator.h.t.cpp | 29 + test/cpp14sanity/flags.h.t.cpp | 29 + test/cpp14sanity/flat_map.h.t.cpp | 29 + test/cpp14sanity/flat_multimap.h.t.cpp | 29 + test/cpp14sanity/flat_multiset.h.t.cpp | 29 + test/cpp14sanity/flat_set.h.t.cpp | 29 + test/cpp14sanity/fnv_1.h.t.cpp | 29 + test/cpp14sanity/format_spec.h.t.cpp | 29 + test/cpp14sanity/forward_list.h.t.cpp | 29 + test/cpp14sanity/frame_check_sequence.h.t.cpp | 29 + test/cpp14sanity/fsm.h.t.cpp | 29 + test/cpp14sanity/function.h.t.cpp | 29 + test/cpp14sanity/functional.h.t.cpp | 29 + test/cpp14sanity/generic_pool.h.t.cpp | 29 + test/cpp14sanity/hash.h.t.cpp | 29 + test/cpp14sanity/ihash.h.t.cpp | 29 + .../imemory_block_allocator.h.t.cpp | 29 + test/cpp14sanity/indirect_vector.h.t.cpp | 29 + test/cpp14sanity/instance_count.h.t.cpp | 29 + test/cpp14sanity/integral_limits.h.t.cpp | 29 + .../intrusive_forward_list.h.t.cpp | 29 + test/cpp14sanity/intrusive_links.h.t.cpp | 29 + test/cpp14sanity/intrusive_list.h.t.cpp | 29 + test/cpp14sanity/intrusive_queue.h.t.cpp | 29 + test/cpp14sanity/intrusive_stack.h.t.cpp | 29 + test/cpp14sanity/io_port.h.t.cpp | 29 + test/cpp14sanity/ipool.h.t.cpp | 29 + .../ireference_counted_message_pool.h.t.cpp | 29 + test/cpp14sanity/iterator.h.t.cpp | 29 + test/cpp14sanity/jenkins.h.t.cpp | 29 + test/cpp14sanity/largest.h.t.cpp | 29 + test/cpp14sanity/limits.h.t.cpp | 29 + test/cpp14sanity/list.h.t.cpp | 29 + test/cpp14sanity/log.h.t.cpp | 29 + test/cpp14sanity/macros.h.t.cpp | 29 + test/cpp14sanity/map.h.t.cpp | 29 + test/cpp14sanity/math_constants.h.t.cpp | 29 + test/cpp14sanity/memory.h.t.cpp | 29 + test/cpp14sanity/memory_model.h.t.cpp | 29 + test/cpp14sanity/message.h.t.cpp | 29 + test/cpp14sanity/message_bus.h.t.cpp | 29 + test/cpp14sanity/message_packet.h.t.cpp | 29 + test/cpp14sanity/message_router.h.t.cpp | 29 + .../message_router_registry.h.t.cpp | 29 + test/cpp14sanity/message_timer.h.t.cpp | 29 + test/cpp14sanity/message_types.h.t.cpp | 29 + test/cpp14sanity/multi_array.h.t.cpp | 29 + test/cpp14sanity/multi_range.h.t.cpp | 29 + test/cpp14sanity/multimap.h.t.cpp | 29 + test/cpp14sanity/multiset.h.t.cpp | 29 + test/cpp14sanity/murmur3.h.t.cpp | 29 + test/cpp14sanity/mutex.h.t.cpp | 29 + test/cpp14sanity/negative.h.t.cpp | 29 + test/cpp14sanity/null_type.h.t.cpp | 29 + test/cpp14sanity/nullptr.h.t.cpp | 29 + test/cpp14sanity/numeric.h.t.cpp | 29 + test/cpp14sanity/observer.h.t.cpp | 29 + test/cpp14sanity/optional.h.t.cpp | 29 + test/cpp14sanity/packet.h.t.cpp | 29 + test/cpp14sanity/parameter_pack.h.t.cpp | 29 + test/cpp14sanity/parameter_type.h.t.cpp | 29 + test/cpp14sanity/pearson.h.t.cpp | 29 + test/cpp14sanity/permutations.h.t.cpp | 29 + test/cpp14sanity/placement_new.h.t.cpp | 29 + test/cpp14sanity/platform.h.t.cpp | 29 + test/cpp14sanity/pool.h.t.cpp | 29 + test/cpp14sanity/power.h.t.cpp | 29 + test/cpp14sanity/priority_queue.h.t.cpp | 29 + test/cpp14sanity/queue.h.t.cpp | 29 + test/cpp14sanity/queue_lockable.h.t.cpp | 29 + test/cpp14sanity/queue_mpmc_mutex.h.t.cpp | 29 + test/cpp14sanity/queue_spsc_atomic.h.t.cpp | 29 + test/cpp14sanity/queue_spsc_isr.h.t.cpp | 29 + test/cpp14sanity/queue_spsc_locked.h.t.cpp | 29 + test/cpp14sanity/radix.h.t.cpp | 29 + test/cpp14sanity/random.h.t.cpp | 29 + test/cpp14sanity/ratio.h.t.cpp | 29 + .../reference_counted_message.h.t.cpp | 29 + .../reference_counted_message_pool.h.t.cpp | 29 + .../reference_counted_object.h.t.cpp | 29 + test/cpp14sanity/reference_flat_map.h.t.cpp | 29 + .../reference_flat_multimap.h.t.cpp | 29 + .../reference_flat_multiset.h.t.cpp | 29 + test/cpp14sanity/reference_flat_set.h.t.cpp | 29 + test/cpp14sanity/scaled_rounding.h.t.cpp | 29 + test/cpp14sanity/scheduler.h.t.cpp | 29 + test/cpp14sanity/set.h.t.cpp | 29 + test/cpp14sanity/shared_message.h.t.cpp | 29 + test/cpp14sanity/smallest.h.t.cpp | 29 + test/cpp14sanity/span.h.t.cpp | 29 + test/cpp14sanity/spsc_queue.h.t.cpp | 29 + test/cpp14sanity/sqrt.h.t.cpp | 29 + test/cpp14sanity/stack.h.t.cpp | 29 + test/cpp14sanity/state_chart.h.t.cpp | 29 + test/cpp14sanity/static_assert.h.t.cpp | 29 + test/cpp14sanity/string.h.t.cpp | 29 + test/cpp14sanity/string_stream.h.t.cpp | 29 + test/cpp14sanity/string_utilities.h.t.cpp | 29 + test/cpp14sanity/string_view.h.t.cpp | 29 + test/cpp14sanity/successor.h.t.cpp | 29 + test/cpp14sanity/task.h.t.cpp | 29 + test/cpp14sanity/timer.h.t.cpp | 29 + test/cpp14sanity/to_string.h.t.cpp | 29 + test/cpp14sanity/to_u16string.h.t.cpp | 29 + test/cpp14sanity/to_u32string.h.t.cpp | 29 + test/cpp14sanity/to_wstring.h.t.cpp | 29 + test/cpp14sanity/type_def.h.t.cpp | 29 + test/cpp14sanity/type_lookup.h.t.cpp | 29 + test/cpp14sanity/type_select.h.t.cpp | 29 + test/cpp14sanity/type_traits.h.t.cpp | 29 + test/cpp14sanity/u16format_spec.h.t.cpp | 29 + test/cpp14sanity/u16string.h.t.cpp | 29 + test/cpp14sanity/u16string_stream.h.t.cpp | 29 + test/cpp14sanity/u32format_spec.h.t.cpp | 29 + test/cpp14sanity/u32string.h.t.cpp | 29 + test/cpp14sanity/u32string_stream.h.t.cpp | 29 + test/cpp14sanity/unordered_map.h.t.cpp | 29 + test/cpp14sanity/unordered_multimap.h.t.cpp | 29 + test/cpp14sanity/unordered_multiset.h.t.cpp | 29 + test/cpp14sanity/unordered_set.h.t.cpp | 29 + test/cpp14sanity/user_type.h.t.cpp | 29 + test/cpp14sanity/utility.h.t.cpp | 29 + test/cpp14sanity/variant.h.t.cpp | 29 + test/cpp14sanity/variant_pool.h.t.cpp | 29 + test/cpp14sanity/vector.h.t.cpp | 29 + test/cpp14sanity/version.h.t.cpp | 29 + test/cpp14sanity/visitor.h.t.cpp | 29 + test/cpp14sanity/wformat_spec.h.t.cpp | 29 + test/cpp14sanity/wstring.h.t.cpp | 29 + test/cpp14sanity/wstring_stream.h.t.cpp | 29 + test/cpp17sanity/CMakeLists.txt | 202 + test/cpp17sanity/absolute.h.t.cpp | 29 + test/cpp17sanity/algorithm.h.t.cpp | 29 + test/cpp17sanity/alignment.h.t.cpp | 29 + test/cpp17sanity/array.h.t.cpp | 29 + test/cpp17sanity/array_view.h.t.cpp | 29 + test/cpp17sanity/array_wrapper.h.t.cpp | 29 + test/cpp17sanity/atomic.h.t.cpp | 29 + test/cpp17sanity/basic_format_spec.h.t.cpp | 29 + test/cpp17sanity/basic_string.h.t.cpp | 29 + test/cpp17sanity/basic_string_stream.h.t.cpp | 29 + test/cpp17sanity/binary.h.t.cpp | 29 + test/cpp17sanity/bit_stream.h.t.cpp | 29 + test/cpp17sanity/bitset.h.t.cpp | 29 + test/cpp17sanity/bloom_filter.h.t.cpp | 29 + test/cpp17sanity/bresenham_line.h.t.cpp | 29 + test/cpp17sanity/buffer_descriptors.h.t.cpp | 29 + test/cpp17sanity/callback.h.t.cpp | 29 + test/cpp17sanity/callback_service.h.t.cpp | 29 + test/cpp17sanity/callback_timer.h.t.cpp | 29 + test/cpp17sanity/char_traits.h.t.cpp | 29 + test/cpp17sanity/checksum.h.t.cpp | 29 + test/cpp17sanity/circular_buffer.h.t.cpp | 29 + test/cpp17sanity/combinations.h.t.cpp | 29 + test/cpp17sanity/compare.h.t.cpp | 29 + test/cpp17sanity/constant.h.t.cpp | 29 + test/cpp17sanity/container.h.t.cpp | 29 + test/cpp17sanity/crc16.h.t.cpp | 29 + test/cpp17sanity/crc16_aug_ccitt.h.t.cpp | 29 + test/cpp17sanity/crc16_ccitt.h.t.cpp | 29 + test/cpp17sanity/crc16_genibus.h.t.cpp | 29 + test/cpp17sanity/crc16_kermit.h.t.cpp | 29 + test/cpp17sanity/crc16_modbus.h.t.cpp | 29 + test/cpp17sanity/crc16_usb.h.t.cpp | 29 + test/cpp17sanity/crc16_x25.h.t.cpp | 29 + test/cpp17sanity/crc16_xmodem.h.t.cpp | 29 + test/cpp17sanity/crc32.h.t.cpp | 29 + test/cpp17sanity/crc32_bzip2.h.t.cpp | 29 + test/cpp17sanity/crc32_c.h.t.cpp | 29 + test/cpp17sanity/crc32_mpeg2.h.t.cpp | 29 + test/cpp17sanity/crc32_posix.h.t.cpp | 29 + test/cpp17sanity/crc64_ecma.h.t.cpp | 29 + test/cpp17sanity/crc8_ccitt.h.t.cpp | 29 + test/cpp17sanity/crc8_rohc.h.t.cpp | 29 + test/cpp17sanity/cstring.h.t.cpp | 29 + .../cumulative_moving_average.h.t.cpp | 29 + test/cpp17sanity/cyclic_value.h.t.cpp | 29 + test/cpp17sanity/debounce.h.t.cpp | 29 + test/cpp17sanity/debug_count.h.t.cpp | 29 + test/cpp17sanity/delegate.h.t.cpp | 29 + test/cpp17sanity/delegate_service.h.t.cpp | 29 + test/cpp17sanity/deque.h.t.cpp | 29 + test/cpp17sanity/endianness.h.t.cpp | 29 + test/cpp17sanity/enum_type.h.t.cpp | 29 + test/cpp17sanity/error_handler.h.t.cpp | 29 + test/cpp17sanity/etl_profile.h | 34 + test/cpp17sanity/exception.h.t.cpp | 29 + test/cpp17sanity/factorial.h.t.cpp | 29 + test/cpp17sanity/fibonacci.h.t.cpp | 29 + test/cpp17sanity/file_error_numbers.h.t.cpp | 29 + test/cpp17sanity/fixed_iterator.h.t.cpp | 29 + ...fixed_sized_memory_block_allocator.h.t.cpp | 29 + test/cpp17sanity/flags.h.t.cpp | 29 + test/cpp17sanity/flat_map.h.t.cpp | 29 + test/cpp17sanity/flat_multimap.h.t.cpp | 29 + test/cpp17sanity/flat_multiset.h.t.cpp | 29 + test/cpp17sanity/flat_set.h.t.cpp | 29 + test/cpp17sanity/fnv_1.h.t.cpp | 29 + test/cpp17sanity/format_spec.h.t.cpp | 29 + test/cpp17sanity/forward_list.h.t.cpp | 29 + test/cpp17sanity/frame_check_sequence.h.t.cpp | 29 + test/cpp17sanity/fsm.h.t.cpp | 29 + test/cpp17sanity/function.h.t.cpp | 29 + test/cpp17sanity/functional.h.t.cpp | 29 + test/cpp17sanity/generic_pool.h.t.cpp | 29 + test/cpp17sanity/hash.h.t.cpp | 29 + test/cpp17sanity/ihash.h.t.cpp | 29 + .../imemory_block_allocator.h.t.cpp | 29 + test/cpp17sanity/indirect_vector.h.t.cpp | 29 + test/cpp17sanity/instance_count.h.t.cpp | 29 + test/cpp17sanity/integral_limits.h.t.cpp | 29 + .../intrusive_forward_list.h.t.cpp | 29 + test/cpp17sanity/intrusive_links.h.t.cpp | 29 + test/cpp17sanity/intrusive_list.h.t.cpp | 29 + test/cpp17sanity/intrusive_queue.h.t.cpp | 29 + test/cpp17sanity/intrusive_stack.h.t.cpp | 29 + test/cpp17sanity/io_port.h.t.cpp | 29 + test/cpp17sanity/ipool.h.t.cpp | 29 + .../ireference_counted_message_pool.h.t.cpp | 29 + test/cpp17sanity/iterator.h.t.cpp | 29 + test/cpp17sanity/jenkins.h.t.cpp | 29 + test/cpp17sanity/largest.h.t.cpp | 29 + test/cpp17sanity/limits.h.t.cpp | 29 + test/cpp17sanity/list.h.t.cpp | 29 + test/cpp17sanity/log.h.t.cpp | 29 + test/cpp17sanity/macros.h.t.cpp | 29 + test/cpp17sanity/map.h.t.cpp | 29 + test/cpp17sanity/math_constants.h.t.cpp | 29 + test/cpp17sanity/memory.h.t.cpp | 29 + test/cpp17sanity/memory_model.h.t.cpp | 29 + test/cpp17sanity/message.h.t.cpp | 29 + test/cpp17sanity/message_bus.h.t.cpp | 29 + test/cpp17sanity/message_packet.h.t.cpp | 29 + test/cpp17sanity/message_router.h.t.cpp | 29 + .../message_router_registry.h.t.cpp | 29 + test/cpp17sanity/message_timer.h.t.cpp | 29 + test/cpp17sanity/message_types.h.t.cpp | 29 + test/cpp17sanity/multi_array.h.t.cpp | 29 + test/cpp17sanity/multi_range.h.t.cpp | 29 + test/cpp17sanity/multimap.h.t.cpp | 29 + test/cpp17sanity/multiset.h.t.cpp | 29 + test/cpp17sanity/murmur3.h.t.cpp | 29 + test/cpp17sanity/mutex.h.t.cpp | 29 + test/cpp17sanity/negative.h.t.cpp | 29 + test/cpp17sanity/null_type.h.t.cpp | 29 + test/cpp17sanity/nullptr.h.t.cpp | 29 + test/cpp17sanity/numeric.h.t.cpp | 29 + test/cpp17sanity/observer.h.t.cpp | 29 + test/cpp17sanity/optional.h.t.cpp | 29 + test/cpp17sanity/packet.h.t.cpp | 29 + test/cpp17sanity/parameter_pack.h.t.cpp | 29 + test/cpp17sanity/parameter_type.h.t.cpp | 29 + test/cpp17sanity/pearson.h.t.cpp | 29 + test/cpp17sanity/permutations.h.t.cpp | 29 + test/cpp17sanity/placement_new.h.t.cpp | 29 + test/cpp17sanity/platform.h.t.cpp | 29 + test/cpp17sanity/pool.h.t.cpp | 29 + test/cpp17sanity/power.h.t.cpp | 29 + test/cpp17sanity/priority_queue.h.t.cpp | 29 + test/cpp17sanity/queue.h.t.cpp | 29 + test/cpp17sanity/queue_lockable.h.t.cpp | 29 + test/cpp17sanity/queue_mpmc_mutex.h.t.cpp | 29 + test/cpp17sanity/queue_spsc_atomic.h.t.cpp | 29 + test/cpp17sanity/queue_spsc_isr.h.t.cpp | 29 + test/cpp17sanity/queue_spsc_locked.h.t.cpp | 29 + test/cpp17sanity/radix.h.t.cpp | 29 + test/cpp17sanity/random.h.t.cpp | 29 + test/cpp17sanity/ratio.h.t.cpp | 29 + .../reference_counted_message.h.t.cpp | 29 + .../reference_counted_message_pool.h.t.cpp | 29 + .../reference_counted_object.h.t.cpp | 29 + test/cpp17sanity/reference_flat_map.h.t.cpp | 29 + .../reference_flat_multimap.h.t.cpp | 29 + .../reference_flat_multiset.h.t.cpp | 29 + test/cpp17sanity/reference_flat_set.h.t.cpp | 29 + test/cpp17sanity/scaled_rounding.h.t.cpp | 29 + test/cpp17sanity/scheduler.h.t.cpp | 29 + test/cpp17sanity/set.h.t.cpp | 29 + test/cpp17sanity/shared_message.h.t.cpp | 29 + test/cpp17sanity/smallest.h.t.cpp | 29 + test/cpp17sanity/span.h.t.cpp | 29 + test/cpp17sanity/spsc_queue.h.t.cpp | 29 + test/cpp17sanity/sqrt.h.t.cpp | 29 + test/cpp17sanity/stack.h.t.cpp | 29 + test/cpp17sanity/state_chart.h.t.cpp | 29 + test/cpp17sanity/static_assert.h.t.cpp | 29 + test/cpp17sanity/string.h.t.cpp | 29 + test/cpp17sanity/string_stream.h.t.cpp | 29 + test/cpp17sanity/string_utilities.h.t.cpp | 29 + test/cpp17sanity/string_view.h.t.cpp | 29 + test/cpp17sanity/successor.h.t.cpp | 29 + test/cpp17sanity/task.h.t.cpp | 29 + test/cpp17sanity/timer.h.t.cpp | 29 + test/cpp17sanity/to_string.h.t.cpp | 29 + test/cpp17sanity/to_u16string.h.t.cpp | 29 + test/cpp17sanity/to_u32string.h.t.cpp | 29 + test/cpp17sanity/to_wstring.h.t.cpp | 29 + test/cpp17sanity/type_def.h.t.cpp | 29 + test/cpp17sanity/type_lookup.h.t.cpp | 29 + test/cpp17sanity/type_select.h.t.cpp | 29 + test/cpp17sanity/type_traits.h.t.cpp | 29 + test/cpp17sanity/u16format_spec.h.t.cpp | 29 + test/cpp17sanity/u16string.h.t.cpp | 29 + test/cpp17sanity/u16string_stream.h.t.cpp | 29 + test/cpp17sanity/u32format_spec.h.t.cpp | 29 + test/cpp17sanity/u32string.h.t.cpp | 29 + test/cpp17sanity/u32string_stream.h.t.cpp | 29 + test/cpp17sanity/unordered_map.h.t.cpp | 29 + test/cpp17sanity/unordered_multimap.h.t.cpp | 29 + test/cpp17sanity/unordered_multiset.h.t.cpp | 29 + test/cpp17sanity/unordered_set.h.t.cpp | 29 + test/cpp17sanity/user_type.h.t.cpp | 29 + test/cpp17sanity/utility.h.t.cpp | 29 + test/cpp17sanity/variant.h.t.cpp | 29 + test/cpp17sanity/variant_pool.h.t.cpp | 29 + test/cpp17sanity/vector.h.t.cpp | 29 + test/cpp17sanity/version.h.t.cpp | 29 + test/cpp17sanity/visitor.h.t.cpp | 29 + test/cpp17sanity/wformat_spec.h.t.cpp | 29 + test/cpp17sanity/wstring.h.t.cpp | 29 + test/cpp17sanity/wstring_stream.h.t.cpp | 29 + test/data.h | 6 +- test/etl_profile.h | 29 +- test/file.txt | 0 test/iar/etl.dep | 542 - test/iar/etl.ewd | 3037 --- test/iar/etl.ewp | 2519 --- test/iar/etl.ewt | 2453 --- test/iar/etl.eww | 10 - test/iar/main.cpp | 1 - test/iar/settings/etl.Debug.cspy.bat | 40 - test/iar/settings/etl.crun | 16 - test/iar/settings/etl.dbgdt | 5 - test/iar/settings/etl.dni | 45 - test/iar/settings/etl.wsdt | 56 - test/iar/settings/etl.wspos | 2 - test/main.cpp | 2 +- test/murmurhash3.cpp | 6 +- test/murmurhash3.h | 2 +- test/runtests.sh | 27 + test/test_algorithm.cpp | 80 +- test/test_alignment.cpp | 12 +- test/test_array.cpp | 16 +- test/test_array_view.cpp | 118 +- test/test_array_wrapper.cpp | 2 +- test/test_atomic_clang_sync.cpp | 552 + test/test_atomic_gcc_sync.cpp | 42 + test/test_atomic_std.cpp | 65 +- test/test_binary.cpp | 383 +- test/test_bit_stream.cpp | 28 +- test/test_bitset.cpp | 68 +- test/test_bloom_filter.cpp | 4 +- test/test_bresenham_line.cpp | 436 + test/test_bsd_checksum.cpp | 19 +- test/test_buffer_descriptors.cpp | 407 + test/test_callback_service.cpp | 2 +- test/test_callback_timer.cpp | 9 +- test/test_checksum.cpp | 46 +- test/test_circular_buffer.cpp | 909 + test/test_circular_buffer_external_buffer.cpp | 918 + test/test_compare.cpp | 2 +- test/test_compiler_settings.cpp | 2 +- test/test_constant.cpp | 2 +- test/test_container.cpp | 4 +- test/test_crc.cpp | 303 +- test/test_cumulative_moving_average.cpp | 149 +- test/test_cyclic_value.cpp | 4 +- test/test_debounce.cpp | 4 +- test/test_delegate.cpp | 318 +- test/test_delegate_service.cpp | 2 +- test/test_deque.cpp | 134 +- test/test_endian.cpp | 4 +- test/test_enum_type.cpp | 4 +- test/test_error_handler.cpp | 144 +- test/test_exception.cpp | 4 +- test/test_fixed_iterator.cpp | 4 +- ...est_fixed_sized_memory_block_allocator.cpp | 224 + test/test_flags.cpp | 612 + test/test_flat_map.cpp | 187 +- test/test_flat_multimap.cpp | 156 +- test/test_flat_multiset.cpp | 69 +- test/test_flat_set.cpp | 64 +- test/test_fnv_1.cpp | 60 +- test/test_format_spec.cpp | 121 + test/test_forward_list.cpp | 25 +- test/test_forward_list_shared_pool.cpp | 163 +- test/test_fsm.cpp | 96 +- test/test_function.cpp | 4 +- test/test_functional.cpp | 167 +- test/test_hash.cpp | 4 +- test/test_indirect_vector.cpp | 30 +- test/test_indirect_vector_external_buffer.cpp | 20 +- test/test_instance_count.cpp | 4 +- test/test_integral_limits.cpp | 4 +- test/test_intrusive_forward_list.cpp | 5 +- test/test_intrusive_links.cpp | 5 +- test/test_intrusive_list.cpp | 5 +- test/test_intrusive_queue.cpp | 4 +- test/test_intrusive_stack.cpp | 4 +- test/test_io_port.cpp | 4 +- test/test_iterator.cpp | 148 +- test/test_jenkins.cpp | 20 +- test/test_largest.cpp | 108 +- test/test_limits.cpp | 2 +- test/test_list.cpp | 25 +- test/test_list_shared_pool.cpp | 136 +- test/test_make_string.cpp | 69 +- test/test_map.cpp | 287 +- test/test_maths.cpp | 16 +- test/test_memory.cpp | 91 +- test/test_message_bus.cpp | 187 +- test/test_message_packet.cpp | 247 +- test/test_message_router.cpp | 247 +- test/test_message_router_registry.cpp | 396 + test/test_message_timer.cpp | 16 +- test/test_multi_array.cpp | 2 +- test/test_multi_range.cpp | 430 + test/test_multimap.cpp | 282 +- test/test_multiset.cpp | 193 +- test/test_murmur3.cpp | 4 +- test/test_numeric.cpp | 4 +- test/test_observer.cpp | 58 +- test/test_optional.cpp | 16 +- test/test_packet.cpp | 3 +- test/test_parameter_pack.cpp | 63 + test/test_parameter_type.cpp | 4 +- test/test_parity_checksum.cpp | 4 +- test/test_pearson.cpp | 14 +- test/test_pool.cpp | 104 +- test/test_priority_queue.cpp | 4 +- test/test_queue.cpp | 8 +- test/test_queue_lockable.cpp | 720 + test/test_queue_lockable_small.cpp | 718 + test/test_queue_memory_model_small.cpp | 2 +- test/test_queue_mpmc_mutex.cpp | 42 +- test/test_queue_mpmc_mutex_small.cpp | 33 +- test/test_queue_spsc_atomic.cpp | 35 +- test/test_queue_spsc_atomic_small.cpp | 33 +- test/test_queue_spsc_isr.cpp | 38 +- test/test_queue_spsc_isr_small.cpp | 36 +- test/test_queue_spsc_locked.cpp | 38 +- test/test_queue_spsc_locked_small.cpp | 40 +- test/test_random.cpp | 4 +- test/test_reference_flat_map.cpp | 44 +- test/test_reference_flat_multimap.cpp | 47 +- test/test_reference_flat_multiset.cpp | 48 +- test/test_reference_flat_set.cpp | 28 +- test/test_scaled_rounding.cpp | 2 +- test/test_set.cpp | 122 +- test/test_shared_message.cpp | 253 + test/test_smallest.cpp | 211 +- test/test_span.cpp | 633 + test/test_stack.cpp | 8 +- test/test_state_chart.cpp | 6 +- test/test_state_chart_with_data_parameter.cpp | 484 + ...state_chart_with_rvalue_data_parameter.cpp | 515 + test/test_string_char.cpp | 889 +- test/test_string_char_external_buffer.cpp | 4676 +++++ test/test_string_stream.cpp | 315 + test/test_string_stream_u16.cpp | 275 + test/test_string_stream_u32.cpp | 275 + test/test_string_stream_wchar_t.cpp | 276 + test/test_string_u16.cpp | 993 +- test/test_string_u16_external_buffer.cpp | 4676 +++++ test/test_string_u32.cpp | 993 +- test/test_string_u32_external_buffer.cpp | 4659 +++++ test/test_string_utilities.cpp | 1655 ++ test/test_string_utilities_std.cpp | 1606 ++ test/test_string_utilities_std_u16.cpp | 1573 ++ test/test_string_utilities_std_u32.cpp | 1573 ++ test/test_string_utilities_std_wchar_t.cpp | 1573 ++ test/test_string_utilities_u16.cpp | 1621 ++ test/test_string_utilities_u32.cpp | 1621 ++ test/test_string_utilities_wchar_t.cpp | 1621 ++ test/test_string_view.cpp | 509 +- test/test_string_wchar_t.cpp | 996 +- test/test_string_wchar_t_external_buffer.cpp | 4659 +++++ test/test_task_scheduler.cpp | 58 +- test/test_to_string.cpp | 361 +- test/test_to_u16string.cpp | 334 +- test/test_to_u32string.cpp | 336 +- test/test_to_wstring.cpp | 352 +- test/test_type_def.cpp | 4 +- test/test_type_lookup.cpp | 124 +- test/test_type_select.cpp | 76 +- test/test_type_traits.cpp | 82 +- test/test_unordered_map.cpp | 169 +- test/test_unordered_multimap.cpp | 164 +- test/test_unordered_multiset.cpp | 176 +- test/test_unordered_set.cpp | 177 +- test/test_user_type.cpp | 4 +- test/test_utility.cpp | 93 +- test/test_variant.cpp | 5 +- test/test_variant_pool.cpp | 9 +- test/test_vector.cpp | 155 +- test/test_vector_external_buffer.cpp | 88 +- test/test_vector_non_trivial.cpp | 34 +- test/test_vector_pointer.cpp | 151 +- test/test_vector_pointer_external_buffer.cpp | 108 +- test/test_visitor.cpp | 26 +- test/test_xor_checksum.cpp | 4 +- test/test_xor_rotate_checksum.cpp | 2 +- test/unit_test_framework.h | 35 + test/vs2017/.gitignore | 7 - test/vs2017/.vs/etl/v15/.gitignore | 1 - test/vs2017/Debug LLVM/.gitignore | 1 - test/vs2017/Debug LLVM/etl.tlog/.gitignore | 3 - test/vs2017/Debug No Unit Tests/.gitignore | 2 - .../Debug No Unit Tests/etl.tlog/.gitignore | 2 - test/vs2017/DebugLLVMNoSTL/.gitignore | 1 - test/vs2017/DebugNoSTL/.gitignore | 1 - test/vs2017/cpp.hint | 18 - test/vs2017/etl.sln | 79 - test/vs2017/etl.vcxproj | 1579 -- test/vs2017/etl.vcxproj.filters | 1380 -- test/vs2017/random.csv | 16384 ---------------- test/vs2019/.vs/etl/v15/.gitignore | 1 - test/vs2019/cpp.hint | 34 +- test/vs2019/etl.sln | 106 +- test/vs2019/etl.vcxproj | 922 +- test/vs2019/etl.vcxproj.filters | 537 +- 1244 files changed, 100169 insertions(+), 41008 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/clang.yml create mode 100644 .github/workflows/gcc.yml create mode 100644 .github/workflows/vs2019.yml delete mode 100644 .vs/.gitignore delete mode 100644 .vs/ProjectSettings.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 CMakeSettings.json create mode 100644 arduino/Embedded_Template_Library.h create mode 100644 arduino/create_arduino_library.py delete mode 100644 etl.ico delete mode 100644 etl.png delete mode 100644 etl.pspimage delete mode 100644 etl.xar delete mode 100644 etl16.png delete mode 100644 etl48.png delete mode 100644 examples/Debounce/Debounce.sln delete mode 100644 examples/Debounce/Debounce.vcxproj.filters create mode 100644 examples/FunctionInterruptSimulation-Delegates/CMakeLists.txt create mode 100644 examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.sln rename examples/{Debounce/Debounce.vcxproj => FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.vcxproj} (55%) create mode 100644 examples/FunctionInterruptSimulation/CMakeLists.txt create mode 100644 examples/QueuedFSM/CMakeLists.txt create mode 100644 examples/QueuedMessageRouter/CMakeLists.txt rename examples/QueuedMessageRouter/{vs2017 => }/etl_profile.h (91%) delete mode 100644 examples/QueuedMessageRouter/vs2017/.vs/QueuedMessageRouter.sqlite delete mode 100644 examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj.filters rename examples/QueuedMessageRouter/{vs2017 => vs2019}/QueuedMessageRouter.sln (100%) rename examples/QueuedMessageRouter/{vs2017 => vs2019}/QueuedMessageRouter.vcxproj (96%) create mode 100644 examples/Scheduler/CMakeLists.txt create mode 100644 examples/Scheduler/Scheduler.cpp rename {include/etl/profiles => examples/Scheduler}/etl_profile.h (59%) create mode 100644 examples/Scheduler/vs2017/Scheduler.sln create mode 100644 examples/Scheduler/vs2017/Scheduler.vcxproj create mode 100644 examples/Scheduler/vs2019/Scheduler.sln create mode 100644 examples/Scheduler/vs2019/Scheduler.vcxproj create mode 100644 examples/SharedMessage/CMakeLists.txt create mode 100644 examples/SharedMessage/SharedMessage.cpp create mode 100644 examples/SharedMessage/SharedMessage.sln create mode 100644 examples/SharedMessage/SharedMessage.vcxproj create mode 100644 examples/SharedMessage/SharedMessage.vcxproj.filters create mode 100644 examples/SharedMessage/etl_profile.h delete mode 100644 favicon.ico create mode 100644 file.txt create mode 100644 images/etl-round.png delete mode 100644 images/etl.pspimage create mode 100644 images/etl64.png rename etl32.png => images/favicon-32.png (100%) create mode 100644 images/favicon-64.png create mode 100644 include/etl/atomic/atomic_clang_sync.h delete mode 100644 include/etl/atomic/atomic_llvm_sync.h create mode 100644 include/etl/basic_string_stream.h create mode 100644 include/etl/bresenham_line.h create mode 100644 include/etl/buffer_descriptors.h create mode 100644 include/etl/circular_buffer.h create mode 100644 include/etl/experimental/variant_new.h create mode 100644 include/etl/file_error_numbers.h delete mode 100644 include/etl/file_error_numbers.txt create mode 100644 include/etl/fixed_sized_memory_block_allocator.h create mode 100644 include/etl/flags.h delete mode 100644 include/etl/generate.bat delete mode 100644 include/etl/generate_fsm.bat delete mode 100644 include/etl/generate_largest.bat delete mode 100644 include/etl/generate_message_packet.bat delete mode 100644 include/etl/generate_message_router.bat delete mode 100644 include/etl/generate_smallest.bat delete mode 100644 include/etl/generate_type_lookup.bat delete mode 100644 include/etl/generate_type_select.bat delete mode 100644 include/etl/generate_type_traits.bat delete mode 100644 include/etl/generate_variant_pool.bat rename include/etl/{ => generators}/fsm_generator.h (85%) create mode 100644 include/etl/generators/generate.bat create mode 100644 include/etl/generators/generate_fsm.bat create mode 100644 include/etl/generators/generate_largest.bat create mode 100644 include/etl/generators/generate_message_packet.bat create mode 100644 include/etl/generators/generate_message_router.bat create mode 100644 include/etl/generators/generate_smallest.bat create mode 100644 include/etl/generators/generate_type_lookup.bat create mode 100644 include/etl/generators/generate_type_select.bat create mode 100644 include/etl/generators/generate_type_traits.bat create mode 100644 include/etl/generators/generate_variant_pool.bat rename include/etl/{ => generators}/largest_generator.h (94%) rename include/etl/{ => generators}/message_packet_generator.h (52%) rename include/etl/{ => generators}/message_router_generator.h (74%) rename include/etl/{ => generators}/smallest_generator.h (91%) rename include/etl/{ => generators}/type_lookup_generator.h (61%) rename include/etl/{ => generators}/type_select_generator.h (79%) rename include/etl/{ => generators}/type_traits_generator.h (89%) rename include/etl/{ => generators}/variant_pool_generator.h (95%) create mode 100644 include/etl/generic_pool.h create mode 100644 include/etl/imemory_block_allocator.h create mode 100644 include/etl/ipool.h create mode 100644 include/etl/ireference_counted_message_pool.h mode change 100755 => 100644 include/etl/map.h create mode 100644 include/etl/message_router_registry.h create mode 100644 include/etl/multi_range.h create mode 100644 include/etl/mutex/mutex_clang_sync.h create mode 100644 include/etl/parameter_pack.h create mode 100644 include/etl/placement_new.h create mode 100644 include/etl/profiles/clang_generic_no_stl.h create mode 100644 include/etl/profiles/determine_development_os.h create mode 100644 include/etl/profiles/gcc_generic_no_stl.h create mode 100644 include/etl/profiles/gcc_linux_x86_no_stl.h create mode 100644 include/etl/profiles/gcc_windows_x86_no_stl.h create mode 100644 include/etl/profiles/msvc_x86_no_stl.h create mode 100644 include/etl/profiles/ticc_no_stl.h create mode 100644 include/etl/queue_lockable.h create mode 100644 include/etl/reference_counted_message.h create mode 100644 include/etl/reference_counted_message_pool.h create mode 100644 include/etl/reference_counted_object.h mode change 100755 => 100644 include/etl/set.h create mode 100644 include/etl/shared_message.h create mode 100644 include/etl/span.h create mode 100644 include/etl/string.h create mode 100644 include/etl/string_stream.h create mode 100644 include/etl/string_utilities.h create mode 100644 include/etl/successor.h delete mode 100644 include/etl/temp.h create mode 100644 include/etl/u16string_stream.h create mode 100644 include/etl/u32string_stream.h create mode 100644 include/etl/wstring_stream.h create mode 100644 meson.build create mode 100644 temp/fsm-patch.txt create mode 100644 test/.kdev4/test.kdev4 create mode 100644 test/cpp03sanity/CMakeLists.txt create mode 100644 test/cpp03sanity/absolute.h.t.cpp create mode 100644 test/cpp03sanity/algorithm.h.t.cpp create mode 100644 test/cpp03sanity/alignment.h.t.cpp create mode 100644 test/cpp03sanity/array.h.t.cpp create mode 100644 test/cpp03sanity/array_view.h.t.cpp create mode 100644 test/cpp03sanity/array_wrapper.h.t.cpp create mode 100644 test/cpp03sanity/atomic.h.t.cpp create mode 100644 test/cpp03sanity/basic_format_spec.h.t.cpp create mode 100644 test/cpp03sanity/basic_string.h.t.cpp create mode 100644 test/cpp03sanity/basic_string_stream.h.t.cpp create mode 100644 test/cpp03sanity/binary.h.t.cpp create mode 100644 test/cpp03sanity/bit_stream.h.t.cpp create mode 100644 test/cpp03sanity/bitset.h.t.cpp create mode 100644 test/cpp03sanity/bloom_filter.h.t.cpp create mode 100644 test/cpp03sanity/bresenham_line.h.t.cpp create mode 100644 test/cpp03sanity/buffer_descriptors.h.t.cpp create mode 100644 test/cpp03sanity/callback.h.t.cpp create mode 100644 test/cpp03sanity/callback_service.h.t.cpp create mode 100644 test/cpp03sanity/callback_timer.h.t.cpp create mode 100644 test/cpp03sanity/char_traits.h.t.cpp create mode 100644 test/cpp03sanity/checksum.h.t.cpp create mode 100644 test/cpp03sanity/circular_buffer.h.t.cpp create mode 100644 test/cpp03sanity/combinations.h.t.cpp create mode 100644 test/cpp03sanity/compare.h.t.cpp create mode 100644 test/cpp03sanity/constant.h.t.cpp create mode 100644 test/cpp03sanity/container.h.t.cpp create mode 100644 test/cpp03sanity/crc16.h.t.cpp create mode 100644 test/cpp03sanity/crc16_aug_ccitt.h.t.cpp create mode 100644 test/cpp03sanity/crc16_ccitt.h.t.cpp create mode 100644 test/cpp03sanity/crc16_genibus.h.t.cpp create mode 100644 test/cpp03sanity/crc16_kermit.h.t.cpp create mode 100644 test/cpp03sanity/crc16_modbus.h.t.cpp create mode 100644 test/cpp03sanity/crc16_usb.h.t.cpp create mode 100644 test/cpp03sanity/crc16_x25.h.t.cpp create mode 100644 test/cpp03sanity/crc16_xmodem.h.t.cpp create mode 100644 test/cpp03sanity/crc32.h.t.cpp create mode 100644 test/cpp03sanity/crc32_bzip2.h.t.cpp create mode 100644 test/cpp03sanity/crc32_c.h.t.cpp create mode 100644 test/cpp03sanity/crc32_mpeg2.h.t.cpp create mode 100644 test/cpp03sanity/crc32_posix.h.t.cpp create mode 100644 test/cpp03sanity/crc64_ecma.h.t.cpp create mode 100644 test/cpp03sanity/crc8_ccitt.h.t.cpp create mode 100644 test/cpp03sanity/crc8_rohc.h.t.cpp create mode 100644 test/cpp03sanity/cstring.h.t.cpp create mode 100644 test/cpp03sanity/cumulative_moving_average.h.t.cpp create mode 100644 test/cpp03sanity/cyclic_value.h.t.cpp create mode 100644 test/cpp03sanity/debounce.h.t.cpp create mode 100644 test/cpp03sanity/debug_count.h.t.cpp create mode 100644 test/cpp03sanity/delegate.h.t.cpp create mode 100644 test/cpp03sanity/delegate_service.h.t.cpp create mode 100644 test/cpp03sanity/deque.h.t.cpp create mode 100644 test/cpp03sanity/endianness.h.t.cpp create mode 100644 test/cpp03sanity/enum_type.h.t.cpp create mode 100644 test/cpp03sanity/error_handler.h.t.cpp create mode 100644 test/cpp03sanity/etl_profile.h create mode 100644 test/cpp03sanity/exception.h.t.cpp create mode 100644 test/cpp03sanity/factorial.h.t.cpp create mode 100644 test/cpp03sanity/fibonacci.h.t.cpp create mode 100644 test/cpp03sanity/file_error_numbers.h.t.cpp create mode 100644 test/cpp03sanity/fixed_iterator.h.t.cpp create mode 100644 test/cpp03sanity/fixed_sized_memory_block_allocator.h.t.cpp create mode 100644 test/cpp03sanity/flags.h.t.cpp create mode 100644 test/cpp03sanity/flat_map.h.t.cpp create mode 100644 test/cpp03sanity/flat_multimap.h.t.cpp create mode 100644 test/cpp03sanity/flat_multiset.h.t.cpp create mode 100644 test/cpp03sanity/flat_set.h.t.cpp create mode 100644 test/cpp03sanity/fnv_1.h.t.cpp create mode 100644 test/cpp03sanity/format_spec.h.t.cpp create mode 100644 test/cpp03sanity/forward_list.h.t.cpp create mode 100644 test/cpp03sanity/frame_check_sequence.h.t.cpp create mode 100644 test/cpp03sanity/fsm.h.t.cpp create mode 100644 test/cpp03sanity/function.h.t.cpp create mode 100644 test/cpp03sanity/functional.h.t.cpp create mode 100644 test/cpp03sanity/generic_pool.h.t.cpp create mode 100644 test/cpp03sanity/hash.h.t.cpp create mode 100644 test/cpp03sanity/ihash.h.t.cpp create mode 100644 test/cpp03sanity/imemory_block_allocator.h.t.cpp create mode 100644 test/cpp03sanity/indirect_vector.h.t.cpp create mode 100644 test/cpp03sanity/instance_count.h.t.cpp create mode 100644 test/cpp03sanity/integral_limits.h.t.cpp create mode 100644 test/cpp03sanity/intrusive_forward_list.h.t.cpp create mode 100644 test/cpp03sanity/intrusive_links.h.t.cpp create mode 100644 test/cpp03sanity/intrusive_list.h.t.cpp create mode 100644 test/cpp03sanity/intrusive_queue.h.t.cpp create mode 100644 test/cpp03sanity/intrusive_stack.h.t.cpp create mode 100644 test/cpp03sanity/io_port.h.t.cpp create mode 100644 test/cpp03sanity/ipool.h.t.cpp create mode 100644 test/cpp03sanity/ireference_counted_message_pool.h.t.cpp create mode 100644 test/cpp03sanity/iterator.h.t.cpp create mode 100644 test/cpp03sanity/jenkins.h.t.cpp create mode 100644 test/cpp03sanity/largest.h.t.cpp create mode 100644 test/cpp03sanity/limits.h.t.cpp create mode 100644 test/cpp03sanity/list.h.t.cpp create mode 100644 test/cpp03sanity/log.h.t.cpp create mode 100644 test/cpp03sanity/macros.h.t.cpp create mode 100644 test/cpp03sanity/map.h.t.cpp create mode 100644 test/cpp03sanity/math_constants.h.t.cpp create mode 100644 test/cpp03sanity/memory.h.t.cpp create mode 100644 test/cpp03sanity/memory_model.h.t.cpp create mode 100644 test/cpp03sanity/message.h.t.cpp create mode 100644 test/cpp03sanity/message_bus.h.t.cpp create mode 100644 test/cpp03sanity/message_packet.h.t.cpp create mode 100644 test/cpp03sanity/message_router.h.t.cpp create mode 100644 test/cpp03sanity/message_router_registry.h.t.cpp create mode 100644 test/cpp03sanity/message_timer.h.t.cpp create mode 100644 test/cpp03sanity/message_types.h.t.cpp create mode 100644 test/cpp03sanity/multi_array.h.t.cpp create mode 100644 test/cpp03sanity/multi_range.h.t.cpp create mode 100644 test/cpp03sanity/multimap.h.t.cpp create mode 100644 test/cpp03sanity/multiset.h.t.cpp create mode 100644 test/cpp03sanity/murmur3.h.t.cpp create mode 100644 test/cpp03sanity/mutex.h.t.cpp create mode 100644 test/cpp03sanity/negative.h.t.cpp create mode 100644 test/cpp03sanity/null_type.h.t.cpp create mode 100644 test/cpp03sanity/nullptr.h.t.cpp create mode 100644 test/cpp03sanity/numeric.h.t.cpp create mode 100644 test/cpp03sanity/observer.h.t.cpp create mode 100644 test/cpp03sanity/optional.h.t.cpp create mode 100644 test/cpp03sanity/packet.h.t.cpp create mode 100644 test/cpp03sanity/parameter_pack.h.t.cpp create mode 100644 test/cpp03sanity/parameter_type.h.t.cpp create mode 100644 test/cpp03sanity/pearson.h.t.cpp create mode 100644 test/cpp03sanity/permutations.h.t.cpp create mode 100644 test/cpp03sanity/placement_new.h.t.cpp create mode 100644 test/cpp03sanity/platform.h.t.cpp create mode 100644 test/cpp03sanity/pool.h.t.cpp create mode 100644 test/cpp03sanity/power.h.t.cpp create mode 100644 test/cpp03sanity/priority_queue.h.t.cpp create mode 100644 test/cpp03sanity/queue.h.t.cpp create mode 100644 test/cpp03sanity/queue_lockable.h.t.cpp create mode 100644 test/cpp03sanity/queue_mpmc_mutex.h.t.cpp create mode 100644 test/cpp03sanity/queue_spsc_atomic.h.t.cpp create mode 100644 test/cpp03sanity/queue_spsc_isr.h.t.cpp create mode 100644 test/cpp03sanity/queue_spsc_locked.h.t.cpp create mode 100644 test/cpp03sanity/radix.h.t.cpp create mode 100644 test/cpp03sanity/random.h.t.cpp create mode 100644 test/cpp03sanity/ratio.h.t.cpp create mode 100644 test/cpp03sanity/reference_counted_message.h.t.cpp create mode 100644 test/cpp03sanity/reference_counted_message_pool.h.t.cpp create mode 100644 test/cpp03sanity/reference_counted_object.h.t.cpp create mode 100644 test/cpp03sanity/reference_flat_map.h.t.cpp create mode 100644 test/cpp03sanity/reference_flat_multimap.h.t.cpp create mode 100644 test/cpp03sanity/reference_flat_multiset.h.t.cpp create mode 100644 test/cpp03sanity/reference_flat_set.h.t.cpp create mode 100644 test/cpp03sanity/scaled_rounding.h.t.cpp create mode 100644 test/cpp03sanity/scheduler.h.t.cpp create mode 100644 test/cpp03sanity/set.h.t.cpp create mode 100644 test/cpp03sanity/shared_message.h.t.cpp create mode 100644 test/cpp03sanity/smallest.h.t.cpp create mode 100644 test/cpp03sanity/span.h.t.cpp create mode 100644 test/cpp03sanity/spsc_queue.h.t.cpp create mode 100644 test/cpp03sanity/sqrt.h.t.cpp create mode 100644 test/cpp03sanity/stack.h.t.cpp create mode 100644 test/cpp03sanity/state_chart.h.t.cpp create mode 100644 test/cpp03sanity/static_assert.h.t.cpp create mode 100644 test/cpp03sanity/string.h.t.cpp create mode 100644 test/cpp03sanity/string_stream.h.t.cpp create mode 100644 test/cpp03sanity/string_utilities.h.t.cpp create mode 100644 test/cpp03sanity/string_view.h.t.cpp create mode 100644 test/cpp03sanity/successor.h.t.cpp create mode 100644 test/cpp03sanity/task.h.t.cpp create mode 100644 test/cpp03sanity/timer.h.t.cpp create mode 100644 test/cpp03sanity/to_string.h.t.cpp create mode 100644 test/cpp03sanity/to_u16string.h.t.cpp create mode 100644 test/cpp03sanity/to_u32string.h.t.cpp create mode 100644 test/cpp03sanity/to_wstring.h.t.cpp create mode 100644 test/cpp03sanity/type_def.h.t.cpp create mode 100644 test/cpp03sanity/type_lookup.h.t.cpp create mode 100644 test/cpp03sanity/type_select.h.t.cpp create mode 100644 test/cpp03sanity/type_traits.h.t.cpp create mode 100644 test/cpp03sanity/u16format_spec.h.t.cpp create mode 100644 test/cpp03sanity/u16string.h.t.cpp create mode 100644 test/cpp03sanity/u16string_stream.h.t.cpp create mode 100644 test/cpp03sanity/u32format_spec.h.t.cpp create mode 100644 test/cpp03sanity/u32string.h.t.cpp create mode 100644 test/cpp03sanity/u32string_stream.h.t.cpp create mode 100644 test/cpp03sanity/unordered_map.h.t.cpp create mode 100644 test/cpp03sanity/unordered_multimap.h.t.cpp create mode 100644 test/cpp03sanity/unordered_multiset.h.t.cpp create mode 100644 test/cpp03sanity/unordered_set.h.t.cpp create mode 100644 test/cpp03sanity/user_type.h.t.cpp create mode 100644 test/cpp03sanity/utility.h.t.cpp create mode 100644 test/cpp03sanity/variant.h.t.cpp create mode 100644 test/cpp03sanity/variant_pool.h.t.cpp create mode 100644 test/cpp03sanity/vector.h.t.cpp create mode 100644 test/cpp03sanity/version.h.t.cpp create mode 100644 test/cpp03sanity/visitor.h.t.cpp create mode 100644 test/cpp03sanity/wformat_spec.h.t.cpp create mode 100644 test/cpp03sanity/wstring.h.t.cpp create mode 100644 test/cpp03sanity/wstring_stream.h.t.cpp create mode 100644 test/cpp11sanity/CMakeLists.txt create mode 100644 test/cpp11sanity/absolute.h.t.cpp create mode 100644 test/cpp11sanity/algorithm.h.t.cpp create mode 100644 test/cpp11sanity/alignment.h.t.cpp create mode 100644 test/cpp11sanity/array.h.t.cpp create mode 100644 test/cpp11sanity/array_view.h.t.cpp create mode 100644 test/cpp11sanity/array_wrapper.h.t.cpp create mode 100644 test/cpp11sanity/atomic.h.t.cpp create mode 100644 test/cpp11sanity/basic_format_spec.h.t.cpp create mode 100644 test/cpp11sanity/basic_string.h.t.cpp create mode 100644 test/cpp11sanity/basic_string_stream.h.t.cpp create mode 100644 test/cpp11sanity/binary.h.t.cpp create mode 100644 test/cpp11sanity/bit_stream.h.t.cpp create mode 100644 test/cpp11sanity/bitset.h.t.cpp create mode 100644 test/cpp11sanity/bloom_filter.h.t.cpp create mode 100644 test/cpp11sanity/bresenham_line.h.t.cpp create mode 100644 test/cpp11sanity/buffer_descriptors.h.t.cpp create mode 100644 test/cpp11sanity/callback.h.t.cpp create mode 100644 test/cpp11sanity/callback_service.h.t.cpp create mode 100644 test/cpp11sanity/callback_timer.h.t.cpp create mode 100644 test/cpp11sanity/char_traits.h.t.cpp create mode 100644 test/cpp11sanity/checksum.h.t.cpp create mode 100644 test/cpp11sanity/circular_buffer.h.t.cpp create mode 100644 test/cpp11sanity/combinations.h.t.cpp create mode 100644 test/cpp11sanity/compare.h.t.cpp create mode 100644 test/cpp11sanity/constant.h.t.cpp create mode 100644 test/cpp11sanity/container.h.t.cpp create mode 100644 test/cpp11sanity/crc16.h.t.cpp create mode 100644 test/cpp11sanity/crc16_aug_ccitt.h.t.cpp create mode 100644 test/cpp11sanity/crc16_ccitt.h.t.cpp create mode 100644 test/cpp11sanity/crc16_genibus.h.t.cpp create mode 100644 test/cpp11sanity/crc16_kermit.h.t.cpp create mode 100644 test/cpp11sanity/crc16_modbus.h.t.cpp create mode 100644 test/cpp11sanity/crc16_usb.h.t.cpp create mode 100644 test/cpp11sanity/crc16_x25.h.t.cpp create mode 100644 test/cpp11sanity/crc16_xmodem.h.t.cpp create mode 100644 test/cpp11sanity/crc32.h.t.cpp create mode 100644 test/cpp11sanity/crc32_bzip2.h.t.cpp create mode 100644 test/cpp11sanity/crc32_c.h.t.cpp create mode 100644 test/cpp11sanity/crc32_mpeg2.h.t.cpp create mode 100644 test/cpp11sanity/crc32_posix.h.t.cpp create mode 100644 test/cpp11sanity/crc64_ecma.h.t.cpp create mode 100644 test/cpp11sanity/crc8_ccitt.h.t.cpp create mode 100644 test/cpp11sanity/crc8_rohc.h.t.cpp create mode 100644 test/cpp11sanity/cstring.h.t.cpp create mode 100644 test/cpp11sanity/cumulative_moving_average.h.t.cpp create mode 100644 test/cpp11sanity/cyclic_value.h.t.cpp create mode 100644 test/cpp11sanity/debounce.h.t.cpp create mode 100644 test/cpp11sanity/debug_count.h.t.cpp create mode 100644 test/cpp11sanity/delegate.h.t.cpp create mode 100644 test/cpp11sanity/delegate_service.h.t.cpp create mode 100644 test/cpp11sanity/deque.h.t.cpp create mode 100644 test/cpp11sanity/endianness.h.t.cpp create mode 100644 test/cpp11sanity/enum_type.h.t.cpp create mode 100644 test/cpp11sanity/error_handler.h.t.cpp create mode 100644 test/cpp11sanity/etl_profile.h create mode 100644 test/cpp11sanity/exception.h.t.cpp create mode 100644 test/cpp11sanity/factorial.h.t.cpp create mode 100644 test/cpp11sanity/fibonacci.h.t.cpp create mode 100644 test/cpp11sanity/file_error_numbers.h.t.cpp create mode 100644 test/cpp11sanity/fixed_iterator.h.t.cpp create mode 100644 test/cpp11sanity/fixed_sized_memory_block_allocator.h.t.cpp create mode 100644 test/cpp11sanity/flags.h.t.cpp create mode 100644 test/cpp11sanity/flat_map.h.t.cpp create mode 100644 test/cpp11sanity/flat_multimap.h.t.cpp create mode 100644 test/cpp11sanity/flat_multiset.h.t.cpp create mode 100644 test/cpp11sanity/flat_set.h.t.cpp create mode 100644 test/cpp11sanity/fnv_1.h.t.cpp create mode 100644 test/cpp11sanity/format_spec.h.t.cpp create mode 100644 test/cpp11sanity/forward_list.h.t.cpp create mode 100644 test/cpp11sanity/frame_check_sequence.h.t.cpp create mode 100644 test/cpp11sanity/fsm.h.t.cpp create mode 100644 test/cpp11sanity/function.h.t.cpp create mode 100644 test/cpp11sanity/functional.h.t.cpp create mode 100644 test/cpp11sanity/generic_pool.h.t.cpp create mode 100644 test/cpp11sanity/hash.h.t.cpp create mode 100644 test/cpp11sanity/ihash.h.t.cpp create mode 100644 test/cpp11sanity/imemory_block_allocator.h.t.cpp create mode 100644 test/cpp11sanity/indirect_vector.h.t.cpp create mode 100644 test/cpp11sanity/instance_count.h.t.cpp create mode 100644 test/cpp11sanity/integral_limits.h.t.cpp create mode 100644 test/cpp11sanity/intrusive_forward_list.h.t.cpp create mode 100644 test/cpp11sanity/intrusive_links.h.t.cpp create mode 100644 test/cpp11sanity/intrusive_list.h.t.cpp create mode 100644 test/cpp11sanity/intrusive_queue.h.t.cpp create mode 100644 test/cpp11sanity/intrusive_stack.h.t.cpp create mode 100644 test/cpp11sanity/io_port.h.t.cpp create mode 100644 test/cpp11sanity/ipool.h.t.cpp create mode 100644 test/cpp11sanity/ireference_counted_message_pool.h.t.cpp create mode 100644 test/cpp11sanity/iterator.h.t.cpp create mode 100644 test/cpp11sanity/jenkins.h.t.cpp create mode 100644 test/cpp11sanity/largest.h.t.cpp create mode 100644 test/cpp11sanity/limits.h.t.cpp create mode 100644 test/cpp11sanity/list.h.t.cpp create mode 100644 test/cpp11sanity/log.h.t.cpp create mode 100644 test/cpp11sanity/macros.h.t.cpp create mode 100644 test/cpp11sanity/map.h.t.cpp create mode 100644 test/cpp11sanity/math_constants.h.t.cpp create mode 100644 test/cpp11sanity/memory.h.t.cpp create mode 100644 test/cpp11sanity/memory_model.h.t.cpp create mode 100644 test/cpp11sanity/message.h.t.cpp create mode 100644 test/cpp11sanity/message_bus.h.t.cpp create mode 100644 test/cpp11sanity/message_packet.h.t.cpp create mode 100644 test/cpp11sanity/message_router.h.t.cpp create mode 100644 test/cpp11sanity/message_router_registry.h.t.cpp create mode 100644 test/cpp11sanity/message_timer.h.t.cpp create mode 100644 test/cpp11sanity/message_types.h.t.cpp create mode 100644 test/cpp11sanity/multi_array.h.t.cpp create mode 100644 test/cpp11sanity/multi_range.h.t.cpp create mode 100644 test/cpp11sanity/multimap.h.t.cpp create mode 100644 test/cpp11sanity/multiset.h.t.cpp create mode 100644 test/cpp11sanity/murmur3.h.t.cpp create mode 100644 test/cpp11sanity/mutex.h.t.cpp create mode 100644 test/cpp11sanity/negative.h.t.cpp create mode 100644 test/cpp11sanity/null_type.h.t.cpp create mode 100644 test/cpp11sanity/nullptr.h.t.cpp create mode 100644 test/cpp11sanity/numeric.h.t.cpp create mode 100644 test/cpp11sanity/observer.h.t.cpp create mode 100644 test/cpp11sanity/optional.h.t.cpp create mode 100644 test/cpp11sanity/packet.h.t.cpp create mode 100644 test/cpp11sanity/parameter_pack.h.t.cpp create mode 100644 test/cpp11sanity/parameter_type.h.t.cpp create mode 100644 test/cpp11sanity/pearson.h.t.cpp create mode 100644 test/cpp11sanity/permutations.h.t.cpp create mode 100644 test/cpp11sanity/placement_new.h.t.cpp create mode 100644 test/cpp11sanity/platform.h.t.cpp create mode 100644 test/cpp11sanity/pool.h.t.cpp create mode 100644 test/cpp11sanity/power.h.t.cpp create mode 100644 test/cpp11sanity/priority_queue.h.t.cpp create mode 100644 test/cpp11sanity/queue.h.t.cpp create mode 100644 test/cpp11sanity/queue_lockable.h.t.cpp create mode 100644 test/cpp11sanity/queue_mpmc_mutex.h.t.cpp create mode 100644 test/cpp11sanity/queue_spsc_atomic.h.t.cpp create mode 100644 test/cpp11sanity/queue_spsc_isr.h.t.cpp create mode 100644 test/cpp11sanity/queue_spsc_locked.h.t.cpp create mode 100644 test/cpp11sanity/radix.h.t.cpp create mode 100644 test/cpp11sanity/random.h.t.cpp create mode 100644 test/cpp11sanity/ratio.h.t.cpp create mode 100644 test/cpp11sanity/reference_counted_message.h.t.cpp create mode 100644 test/cpp11sanity/reference_counted_message_pool.h.t.cpp create mode 100644 test/cpp11sanity/reference_counted_object.h.t.cpp create mode 100644 test/cpp11sanity/reference_flat_map.h.t.cpp create mode 100644 test/cpp11sanity/reference_flat_multimap.h.t.cpp create mode 100644 test/cpp11sanity/reference_flat_multiset.h.t.cpp create mode 100644 test/cpp11sanity/reference_flat_set.h.t.cpp create mode 100644 test/cpp11sanity/scaled_rounding.h.t.cpp create mode 100644 test/cpp11sanity/scheduler.h.t.cpp create mode 100644 test/cpp11sanity/set.h.t.cpp create mode 100644 test/cpp11sanity/shared_message.h.t.cpp create mode 100644 test/cpp11sanity/smallest.h.t.cpp create mode 100644 test/cpp11sanity/span.h.t.cpp create mode 100644 test/cpp11sanity/spsc_queue.h.t.cpp create mode 100644 test/cpp11sanity/sqrt.h.t.cpp create mode 100644 test/cpp11sanity/stack.h.t.cpp create mode 100644 test/cpp11sanity/state_chart.h.t.cpp create mode 100644 test/cpp11sanity/static_assert.h.t.cpp create mode 100644 test/cpp11sanity/string.h.t.cpp create mode 100644 test/cpp11sanity/string_stream.h.t.cpp create mode 100644 test/cpp11sanity/string_utilities.h.t.cpp create mode 100644 test/cpp11sanity/string_view.h.t.cpp create mode 100644 test/cpp11sanity/successor.h.t.cpp create mode 100644 test/cpp11sanity/task.h.t.cpp create mode 100644 test/cpp11sanity/timer.h.t.cpp create mode 100644 test/cpp11sanity/to_string.h.t.cpp create mode 100644 test/cpp11sanity/to_u16string.h.t.cpp create mode 100644 test/cpp11sanity/to_u32string.h.t.cpp create mode 100644 test/cpp11sanity/to_wstring.h.t.cpp create mode 100644 test/cpp11sanity/type_def.h.t.cpp create mode 100644 test/cpp11sanity/type_lookup.h.t.cpp create mode 100644 test/cpp11sanity/type_select.h.t.cpp create mode 100644 test/cpp11sanity/type_traits.h.t.cpp create mode 100644 test/cpp11sanity/u16format_spec.h.t.cpp create mode 100644 test/cpp11sanity/u16string.h.t.cpp create mode 100644 test/cpp11sanity/u16string_stream.h.t.cpp create mode 100644 test/cpp11sanity/u32format_spec.h.t.cpp create mode 100644 test/cpp11sanity/u32string.h.t.cpp create mode 100644 test/cpp11sanity/u32string_stream.h.t.cpp create mode 100644 test/cpp11sanity/unordered_map.h.t.cpp create mode 100644 test/cpp11sanity/unordered_multimap.h.t.cpp create mode 100644 test/cpp11sanity/unordered_multiset.h.t.cpp create mode 100644 test/cpp11sanity/unordered_set.h.t.cpp create mode 100644 test/cpp11sanity/user_type.h.t.cpp create mode 100644 test/cpp11sanity/utility.h.t.cpp create mode 100644 test/cpp11sanity/variant.h.t.cpp create mode 100644 test/cpp11sanity/variant_pool.h.t.cpp create mode 100644 test/cpp11sanity/vector.h.t.cpp create mode 100644 test/cpp11sanity/version.h.t.cpp create mode 100644 test/cpp11sanity/visitor.h.t.cpp create mode 100644 test/cpp11sanity/wformat_spec.h.t.cpp create mode 100644 test/cpp11sanity/wstring.h.t.cpp create mode 100644 test/cpp11sanity/wstring_stream.h.t.cpp create mode 100644 test/cpp14sanity/CMakeLists.txt create mode 100644 test/cpp14sanity/absolute.h.t.cpp create mode 100644 test/cpp14sanity/algorithm.h.t.cpp create mode 100644 test/cpp14sanity/alignment.h.t.cpp create mode 100644 test/cpp14sanity/array.h.t.cpp create mode 100644 test/cpp14sanity/array_view.h.t.cpp create mode 100644 test/cpp14sanity/array_wrapper.h.t.cpp create mode 100644 test/cpp14sanity/atomic.h.t.cpp create mode 100644 test/cpp14sanity/basic_format_spec.h.t.cpp create mode 100644 test/cpp14sanity/basic_string.h.t.cpp create mode 100644 test/cpp14sanity/basic_string_stream.h.t.cpp create mode 100644 test/cpp14sanity/binary.h.t.cpp create mode 100644 test/cpp14sanity/bit_stream.h.t.cpp create mode 100644 test/cpp14sanity/bitset.h.t.cpp create mode 100644 test/cpp14sanity/bloom_filter.h.t.cpp create mode 100644 test/cpp14sanity/bresenham_line.h.t.cpp create mode 100644 test/cpp14sanity/buffer_descriptors.h.t.cpp create mode 100644 test/cpp14sanity/callback.h.t.cpp create mode 100644 test/cpp14sanity/callback_service.h.t.cpp create mode 100644 test/cpp14sanity/callback_timer.h.t.cpp create mode 100644 test/cpp14sanity/char_traits.h.t.cpp create mode 100644 test/cpp14sanity/checksum.h.t.cpp create mode 100644 test/cpp14sanity/circular_buffer.h.t.cpp create mode 100644 test/cpp14sanity/combinations.h.t.cpp create mode 100644 test/cpp14sanity/compare.h.t.cpp create mode 100644 test/cpp14sanity/constant.h.t.cpp create mode 100644 test/cpp14sanity/container.h.t.cpp create mode 100644 test/cpp14sanity/crc16.h.t.cpp create mode 100644 test/cpp14sanity/crc16_aug_ccitt.h.t.cpp create mode 100644 test/cpp14sanity/crc16_ccitt.h.t.cpp create mode 100644 test/cpp14sanity/crc16_genibus.h.t.cpp create mode 100644 test/cpp14sanity/crc16_kermit.h.t.cpp create mode 100644 test/cpp14sanity/crc16_modbus.h.t.cpp create mode 100644 test/cpp14sanity/crc16_usb.h.t.cpp create mode 100644 test/cpp14sanity/crc16_x25.h.t.cpp create mode 100644 test/cpp14sanity/crc16_xmodem.h.t.cpp create mode 100644 test/cpp14sanity/crc32.h.t.cpp create mode 100644 test/cpp14sanity/crc32_bzip2.h.t.cpp create mode 100644 test/cpp14sanity/crc32_c.h.t.cpp create mode 100644 test/cpp14sanity/crc32_mpeg2.h.t.cpp create mode 100644 test/cpp14sanity/crc32_posix.h.t.cpp create mode 100644 test/cpp14sanity/crc64_ecma.h.t.cpp create mode 100644 test/cpp14sanity/crc8_ccitt.h.t.cpp create mode 100644 test/cpp14sanity/crc8_rohc.h.t.cpp create mode 100644 test/cpp14sanity/cstring.h.t.cpp create mode 100644 test/cpp14sanity/cumulative_moving_average.h.t.cpp create mode 100644 test/cpp14sanity/cyclic_value.h.t.cpp create mode 100644 test/cpp14sanity/debounce.h.t.cpp create mode 100644 test/cpp14sanity/debug_count.h.t.cpp create mode 100644 test/cpp14sanity/delegate.h.t.cpp create mode 100644 test/cpp14sanity/delegate_service.h.t.cpp create mode 100644 test/cpp14sanity/deque.h.t.cpp create mode 100644 test/cpp14sanity/endianness.h.t.cpp create mode 100644 test/cpp14sanity/enum_type.h.t.cpp create mode 100644 test/cpp14sanity/error_handler.h.t.cpp create mode 100644 test/cpp14sanity/etl_profile.h create mode 100644 test/cpp14sanity/exception.h.t.cpp create mode 100644 test/cpp14sanity/factorial.h.t.cpp create mode 100644 test/cpp14sanity/fibonacci.h.t.cpp create mode 100644 test/cpp14sanity/file_error_numbers.h.t.cpp create mode 100644 test/cpp14sanity/fixed_iterator.h.t.cpp create mode 100644 test/cpp14sanity/fixed_sized_memory_block_allocator.h.t.cpp create mode 100644 test/cpp14sanity/flags.h.t.cpp create mode 100644 test/cpp14sanity/flat_map.h.t.cpp create mode 100644 test/cpp14sanity/flat_multimap.h.t.cpp create mode 100644 test/cpp14sanity/flat_multiset.h.t.cpp create mode 100644 test/cpp14sanity/flat_set.h.t.cpp create mode 100644 test/cpp14sanity/fnv_1.h.t.cpp create mode 100644 test/cpp14sanity/format_spec.h.t.cpp create mode 100644 test/cpp14sanity/forward_list.h.t.cpp create mode 100644 test/cpp14sanity/frame_check_sequence.h.t.cpp create mode 100644 test/cpp14sanity/fsm.h.t.cpp create mode 100644 test/cpp14sanity/function.h.t.cpp create mode 100644 test/cpp14sanity/functional.h.t.cpp create mode 100644 test/cpp14sanity/generic_pool.h.t.cpp create mode 100644 test/cpp14sanity/hash.h.t.cpp create mode 100644 test/cpp14sanity/ihash.h.t.cpp create mode 100644 test/cpp14sanity/imemory_block_allocator.h.t.cpp create mode 100644 test/cpp14sanity/indirect_vector.h.t.cpp create mode 100644 test/cpp14sanity/instance_count.h.t.cpp create mode 100644 test/cpp14sanity/integral_limits.h.t.cpp create mode 100644 test/cpp14sanity/intrusive_forward_list.h.t.cpp create mode 100644 test/cpp14sanity/intrusive_links.h.t.cpp create mode 100644 test/cpp14sanity/intrusive_list.h.t.cpp create mode 100644 test/cpp14sanity/intrusive_queue.h.t.cpp create mode 100644 test/cpp14sanity/intrusive_stack.h.t.cpp create mode 100644 test/cpp14sanity/io_port.h.t.cpp create mode 100644 test/cpp14sanity/ipool.h.t.cpp create mode 100644 test/cpp14sanity/ireference_counted_message_pool.h.t.cpp create mode 100644 test/cpp14sanity/iterator.h.t.cpp create mode 100644 test/cpp14sanity/jenkins.h.t.cpp create mode 100644 test/cpp14sanity/largest.h.t.cpp create mode 100644 test/cpp14sanity/limits.h.t.cpp create mode 100644 test/cpp14sanity/list.h.t.cpp create mode 100644 test/cpp14sanity/log.h.t.cpp create mode 100644 test/cpp14sanity/macros.h.t.cpp create mode 100644 test/cpp14sanity/map.h.t.cpp create mode 100644 test/cpp14sanity/math_constants.h.t.cpp create mode 100644 test/cpp14sanity/memory.h.t.cpp create mode 100644 test/cpp14sanity/memory_model.h.t.cpp create mode 100644 test/cpp14sanity/message.h.t.cpp create mode 100644 test/cpp14sanity/message_bus.h.t.cpp create mode 100644 test/cpp14sanity/message_packet.h.t.cpp create mode 100644 test/cpp14sanity/message_router.h.t.cpp create mode 100644 test/cpp14sanity/message_router_registry.h.t.cpp create mode 100644 test/cpp14sanity/message_timer.h.t.cpp create mode 100644 test/cpp14sanity/message_types.h.t.cpp create mode 100644 test/cpp14sanity/multi_array.h.t.cpp create mode 100644 test/cpp14sanity/multi_range.h.t.cpp create mode 100644 test/cpp14sanity/multimap.h.t.cpp create mode 100644 test/cpp14sanity/multiset.h.t.cpp create mode 100644 test/cpp14sanity/murmur3.h.t.cpp create mode 100644 test/cpp14sanity/mutex.h.t.cpp create mode 100644 test/cpp14sanity/negative.h.t.cpp create mode 100644 test/cpp14sanity/null_type.h.t.cpp create mode 100644 test/cpp14sanity/nullptr.h.t.cpp create mode 100644 test/cpp14sanity/numeric.h.t.cpp create mode 100644 test/cpp14sanity/observer.h.t.cpp create mode 100644 test/cpp14sanity/optional.h.t.cpp create mode 100644 test/cpp14sanity/packet.h.t.cpp create mode 100644 test/cpp14sanity/parameter_pack.h.t.cpp create mode 100644 test/cpp14sanity/parameter_type.h.t.cpp create mode 100644 test/cpp14sanity/pearson.h.t.cpp create mode 100644 test/cpp14sanity/permutations.h.t.cpp create mode 100644 test/cpp14sanity/placement_new.h.t.cpp create mode 100644 test/cpp14sanity/platform.h.t.cpp create mode 100644 test/cpp14sanity/pool.h.t.cpp create mode 100644 test/cpp14sanity/power.h.t.cpp create mode 100644 test/cpp14sanity/priority_queue.h.t.cpp create mode 100644 test/cpp14sanity/queue.h.t.cpp create mode 100644 test/cpp14sanity/queue_lockable.h.t.cpp create mode 100644 test/cpp14sanity/queue_mpmc_mutex.h.t.cpp create mode 100644 test/cpp14sanity/queue_spsc_atomic.h.t.cpp create mode 100644 test/cpp14sanity/queue_spsc_isr.h.t.cpp create mode 100644 test/cpp14sanity/queue_spsc_locked.h.t.cpp create mode 100644 test/cpp14sanity/radix.h.t.cpp create mode 100644 test/cpp14sanity/random.h.t.cpp create mode 100644 test/cpp14sanity/ratio.h.t.cpp create mode 100644 test/cpp14sanity/reference_counted_message.h.t.cpp create mode 100644 test/cpp14sanity/reference_counted_message_pool.h.t.cpp create mode 100644 test/cpp14sanity/reference_counted_object.h.t.cpp create mode 100644 test/cpp14sanity/reference_flat_map.h.t.cpp create mode 100644 test/cpp14sanity/reference_flat_multimap.h.t.cpp create mode 100644 test/cpp14sanity/reference_flat_multiset.h.t.cpp create mode 100644 test/cpp14sanity/reference_flat_set.h.t.cpp create mode 100644 test/cpp14sanity/scaled_rounding.h.t.cpp create mode 100644 test/cpp14sanity/scheduler.h.t.cpp create mode 100644 test/cpp14sanity/set.h.t.cpp create mode 100644 test/cpp14sanity/shared_message.h.t.cpp create mode 100644 test/cpp14sanity/smallest.h.t.cpp create mode 100644 test/cpp14sanity/span.h.t.cpp create mode 100644 test/cpp14sanity/spsc_queue.h.t.cpp create mode 100644 test/cpp14sanity/sqrt.h.t.cpp create mode 100644 test/cpp14sanity/stack.h.t.cpp create mode 100644 test/cpp14sanity/state_chart.h.t.cpp create mode 100644 test/cpp14sanity/static_assert.h.t.cpp create mode 100644 test/cpp14sanity/string.h.t.cpp create mode 100644 test/cpp14sanity/string_stream.h.t.cpp create mode 100644 test/cpp14sanity/string_utilities.h.t.cpp create mode 100644 test/cpp14sanity/string_view.h.t.cpp create mode 100644 test/cpp14sanity/successor.h.t.cpp create mode 100644 test/cpp14sanity/task.h.t.cpp create mode 100644 test/cpp14sanity/timer.h.t.cpp create mode 100644 test/cpp14sanity/to_string.h.t.cpp create mode 100644 test/cpp14sanity/to_u16string.h.t.cpp create mode 100644 test/cpp14sanity/to_u32string.h.t.cpp create mode 100644 test/cpp14sanity/to_wstring.h.t.cpp create mode 100644 test/cpp14sanity/type_def.h.t.cpp create mode 100644 test/cpp14sanity/type_lookup.h.t.cpp create mode 100644 test/cpp14sanity/type_select.h.t.cpp create mode 100644 test/cpp14sanity/type_traits.h.t.cpp create mode 100644 test/cpp14sanity/u16format_spec.h.t.cpp create mode 100644 test/cpp14sanity/u16string.h.t.cpp create mode 100644 test/cpp14sanity/u16string_stream.h.t.cpp create mode 100644 test/cpp14sanity/u32format_spec.h.t.cpp create mode 100644 test/cpp14sanity/u32string.h.t.cpp create mode 100644 test/cpp14sanity/u32string_stream.h.t.cpp create mode 100644 test/cpp14sanity/unordered_map.h.t.cpp create mode 100644 test/cpp14sanity/unordered_multimap.h.t.cpp create mode 100644 test/cpp14sanity/unordered_multiset.h.t.cpp create mode 100644 test/cpp14sanity/unordered_set.h.t.cpp create mode 100644 test/cpp14sanity/user_type.h.t.cpp create mode 100644 test/cpp14sanity/utility.h.t.cpp create mode 100644 test/cpp14sanity/variant.h.t.cpp create mode 100644 test/cpp14sanity/variant_pool.h.t.cpp create mode 100644 test/cpp14sanity/vector.h.t.cpp create mode 100644 test/cpp14sanity/version.h.t.cpp create mode 100644 test/cpp14sanity/visitor.h.t.cpp create mode 100644 test/cpp14sanity/wformat_spec.h.t.cpp create mode 100644 test/cpp14sanity/wstring.h.t.cpp create mode 100644 test/cpp14sanity/wstring_stream.h.t.cpp create mode 100644 test/cpp17sanity/CMakeLists.txt create mode 100644 test/cpp17sanity/absolute.h.t.cpp create mode 100644 test/cpp17sanity/algorithm.h.t.cpp create mode 100644 test/cpp17sanity/alignment.h.t.cpp create mode 100644 test/cpp17sanity/array.h.t.cpp create mode 100644 test/cpp17sanity/array_view.h.t.cpp create mode 100644 test/cpp17sanity/array_wrapper.h.t.cpp create mode 100644 test/cpp17sanity/atomic.h.t.cpp create mode 100644 test/cpp17sanity/basic_format_spec.h.t.cpp create mode 100644 test/cpp17sanity/basic_string.h.t.cpp create mode 100644 test/cpp17sanity/basic_string_stream.h.t.cpp create mode 100644 test/cpp17sanity/binary.h.t.cpp create mode 100644 test/cpp17sanity/bit_stream.h.t.cpp create mode 100644 test/cpp17sanity/bitset.h.t.cpp create mode 100644 test/cpp17sanity/bloom_filter.h.t.cpp create mode 100644 test/cpp17sanity/bresenham_line.h.t.cpp create mode 100644 test/cpp17sanity/buffer_descriptors.h.t.cpp create mode 100644 test/cpp17sanity/callback.h.t.cpp create mode 100644 test/cpp17sanity/callback_service.h.t.cpp create mode 100644 test/cpp17sanity/callback_timer.h.t.cpp create mode 100644 test/cpp17sanity/char_traits.h.t.cpp create mode 100644 test/cpp17sanity/checksum.h.t.cpp create mode 100644 test/cpp17sanity/circular_buffer.h.t.cpp create mode 100644 test/cpp17sanity/combinations.h.t.cpp create mode 100644 test/cpp17sanity/compare.h.t.cpp create mode 100644 test/cpp17sanity/constant.h.t.cpp create mode 100644 test/cpp17sanity/container.h.t.cpp create mode 100644 test/cpp17sanity/crc16.h.t.cpp create mode 100644 test/cpp17sanity/crc16_aug_ccitt.h.t.cpp create mode 100644 test/cpp17sanity/crc16_ccitt.h.t.cpp create mode 100644 test/cpp17sanity/crc16_genibus.h.t.cpp create mode 100644 test/cpp17sanity/crc16_kermit.h.t.cpp create mode 100644 test/cpp17sanity/crc16_modbus.h.t.cpp create mode 100644 test/cpp17sanity/crc16_usb.h.t.cpp create mode 100644 test/cpp17sanity/crc16_x25.h.t.cpp create mode 100644 test/cpp17sanity/crc16_xmodem.h.t.cpp create mode 100644 test/cpp17sanity/crc32.h.t.cpp create mode 100644 test/cpp17sanity/crc32_bzip2.h.t.cpp create mode 100644 test/cpp17sanity/crc32_c.h.t.cpp create mode 100644 test/cpp17sanity/crc32_mpeg2.h.t.cpp create mode 100644 test/cpp17sanity/crc32_posix.h.t.cpp create mode 100644 test/cpp17sanity/crc64_ecma.h.t.cpp create mode 100644 test/cpp17sanity/crc8_ccitt.h.t.cpp create mode 100644 test/cpp17sanity/crc8_rohc.h.t.cpp create mode 100644 test/cpp17sanity/cstring.h.t.cpp create mode 100644 test/cpp17sanity/cumulative_moving_average.h.t.cpp create mode 100644 test/cpp17sanity/cyclic_value.h.t.cpp create mode 100644 test/cpp17sanity/debounce.h.t.cpp create mode 100644 test/cpp17sanity/debug_count.h.t.cpp create mode 100644 test/cpp17sanity/delegate.h.t.cpp create mode 100644 test/cpp17sanity/delegate_service.h.t.cpp create mode 100644 test/cpp17sanity/deque.h.t.cpp create mode 100644 test/cpp17sanity/endianness.h.t.cpp create mode 100644 test/cpp17sanity/enum_type.h.t.cpp create mode 100644 test/cpp17sanity/error_handler.h.t.cpp create mode 100644 test/cpp17sanity/etl_profile.h create mode 100644 test/cpp17sanity/exception.h.t.cpp create mode 100644 test/cpp17sanity/factorial.h.t.cpp create mode 100644 test/cpp17sanity/fibonacci.h.t.cpp create mode 100644 test/cpp17sanity/file_error_numbers.h.t.cpp create mode 100644 test/cpp17sanity/fixed_iterator.h.t.cpp create mode 100644 test/cpp17sanity/fixed_sized_memory_block_allocator.h.t.cpp create mode 100644 test/cpp17sanity/flags.h.t.cpp create mode 100644 test/cpp17sanity/flat_map.h.t.cpp create mode 100644 test/cpp17sanity/flat_multimap.h.t.cpp create mode 100644 test/cpp17sanity/flat_multiset.h.t.cpp create mode 100644 test/cpp17sanity/flat_set.h.t.cpp create mode 100644 test/cpp17sanity/fnv_1.h.t.cpp create mode 100644 test/cpp17sanity/format_spec.h.t.cpp create mode 100644 test/cpp17sanity/forward_list.h.t.cpp create mode 100644 test/cpp17sanity/frame_check_sequence.h.t.cpp create mode 100644 test/cpp17sanity/fsm.h.t.cpp create mode 100644 test/cpp17sanity/function.h.t.cpp create mode 100644 test/cpp17sanity/functional.h.t.cpp create mode 100644 test/cpp17sanity/generic_pool.h.t.cpp create mode 100644 test/cpp17sanity/hash.h.t.cpp create mode 100644 test/cpp17sanity/ihash.h.t.cpp create mode 100644 test/cpp17sanity/imemory_block_allocator.h.t.cpp create mode 100644 test/cpp17sanity/indirect_vector.h.t.cpp create mode 100644 test/cpp17sanity/instance_count.h.t.cpp create mode 100644 test/cpp17sanity/integral_limits.h.t.cpp create mode 100644 test/cpp17sanity/intrusive_forward_list.h.t.cpp create mode 100644 test/cpp17sanity/intrusive_links.h.t.cpp create mode 100644 test/cpp17sanity/intrusive_list.h.t.cpp create mode 100644 test/cpp17sanity/intrusive_queue.h.t.cpp create mode 100644 test/cpp17sanity/intrusive_stack.h.t.cpp create mode 100644 test/cpp17sanity/io_port.h.t.cpp create mode 100644 test/cpp17sanity/ipool.h.t.cpp create mode 100644 test/cpp17sanity/ireference_counted_message_pool.h.t.cpp create mode 100644 test/cpp17sanity/iterator.h.t.cpp create mode 100644 test/cpp17sanity/jenkins.h.t.cpp create mode 100644 test/cpp17sanity/largest.h.t.cpp create mode 100644 test/cpp17sanity/limits.h.t.cpp create mode 100644 test/cpp17sanity/list.h.t.cpp create mode 100644 test/cpp17sanity/log.h.t.cpp create mode 100644 test/cpp17sanity/macros.h.t.cpp create mode 100644 test/cpp17sanity/map.h.t.cpp create mode 100644 test/cpp17sanity/math_constants.h.t.cpp create mode 100644 test/cpp17sanity/memory.h.t.cpp create mode 100644 test/cpp17sanity/memory_model.h.t.cpp create mode 100644 test/cpp17sanity/message.h.t.cpp create mode 100644 test/cpp17sanity/message_bus.h.t.cpp create mode 100644 test/cpp17sanity/message_packet.h.t.cpp create mode 100644 test/cpp17sanity/message_router.h.t.cpp create mode 100644 test/cpp17sanity/message_router_registry.h.t.cpp create mode 100644 test/cpp17sanity/message_timer.h.t.cpp create mode 100644 test/cpp17sanity/message_types.h.t.cpp create mode 100644 test/cpp17sanity/multi_array.h.t.cpp create mode 100644 test/cpp17sanity/multi_range.h.t.cpp create mode 100644 test/cpp17sanity/multimap.h.t.cpp create mode 100644 test/cpp17sanity/multiset.h.t.cpp create mode 100644 test/cpp17sanity/murmur3.h.t.cpp create mode 100644 test/cpp17sanity/mutex.h.t.cpp create mode 100644 test/cpp17sanity/negative.h.t.cpp create mode 100644 test/cpp17sanity/null_type.h.t.cpp create mode 100644 test/cpp17sanity/nullptr.h.t.cpp create mode 100644 test/cpp17sanity/numeric.h.t.cpp create mode 100644 test/cpp17sanity/observer.h.t.cpp create mode 100644 test/cpp17sanity/optional.h.t.cpp create mode 100644 test/cpp17sanity/packet.h.t.cpp create mode 100644 test/cpp17sanity/parameter_pack.h.t.cpp create mode 100644 test/cpp17sanity/parameter_type.h.t.cpp create mode 100644 test/cpp17sanity/pearson.h.t.cpp create mode 100644 test/cpp17sanity/permutations.h.t.cpp create mode 100644 test/cpp17sanity/placement_new.h.t.cpp create mode 100644 test/cpp17sanity/platform.h.t.cpp create mode 100644 test/cpp17sanity/pool.h.t.cpp create mode 100644 test/cpp17sanity/power.h.t.cpp create mode 100644 test/cpp17sanity/priority_queue.h.t.cpp create mode 100644 test/cpp17sanity/queue.h.t.cpp create mode 100644 test/cpp17sanity/queue_lockable.h.t.cpp create mode 100644 test/cpp17sanity/queue_mpmc_mutex.h.t.cpp create mode 100644 test/cpp17sanity/queue_spsc_atomic.h.t.cpp create mode 100644 test/cpp17sanity/queue_spsc_isr.h.t.cpp create mode 100644 test/cpp17sanity/queue_spsc_locked.h.t.cpp create mode 100644 test/cpp17sanity/radix.h.t.cpp create mode 100644 test/cpp17sanity/random.h.t.cpp create mode 100644 test/cpp17sanity/ratio.h.t.cpp create mode 100644 test/cpp17sanity/reference_counted_message.h.t.cpp create mode 100644 test/cpp17sanity/reference_counted_message_pool.h.t.cpp create mode 100644 test/cpp17sanity/reference_counted_object.h.t.cpp create mode 100644 test/cpp17sanity/reference_flat_map.h.t.cpp create mode 100644 test/cpp17sanity/reference_flat_multimap.h.t.cpp create mode 100644 test/cpp17sanity/reference_flat_multiset.h.t.cpp create mode 100644 test/cpp17sanity/reference_flat_set.h.t.cpp create mode 100644 test/cpp17sanity/scaled_rounding.h.t.cpp create mode 100644 test/cpp17sanity/scheduler.h.t.cpp create mode 100644 test/cpp17sanity/set.h.t.cpp create mode 100644 test/cpp17sanity/shared_message.h.t.cpp create mode 100644 test/cpp17sanity/smallest.h.t.cpp create mode 100644 test/cpp17sanity/span.h.t.cpp create mode 100644 test/cpp17sanity/spsc_queue.h.t.cpp create mode 100644 test/cpp17sanity/sqrt.h.t.cpp create mode 100644 test/cpp17sanity/stack.h.t.cpp create mode 100644 test/cpp17sanity/state_chart.h.t.cpp create mode 100644 test/cpp17sanity/static_assert.h.t.cpp create mode 100644 test/cpp17sanity/string.h.t.cpp create mode 100644 test/cpp17sanity/string_stream.h.t.cpp create mode 100644 test/cpp17sanity/string_utilities.h.t.cpp create mode 100644 test/cpp17sanity/string_view.h.t.cpp create mode 100644 test/cpp17sanity/successor.h.t.cpp create mode 100644 test/cpp17sanity/task.h.t.cpp create mode 100644 test/cpp17sanity/timer.h.t.cpp create mode 100644 test/cpp17sanity/to_string.h.t.cpp create mode 100644 test/cpp17sanity/to_u16string.h.t.cpp create mode 100644 test/cpp17sanity/to_u32string.h.t.cpp create mode 100644 test/cpp17sanity/to_wstring.h.t.cpp create mode 100644 test/cpp17sanity/type_def.h.t.cpp create mode 100644 test/cpp17sanity/type_lookup.h.t.cpp create mode 100644 test/cpp17sanity/type_select.h.t.cpp create mode 100644 test/cpp17sanity/type_traits.h.t.cpp create mode 100644 test/cpp17sanity/u16format_spec.h.t.cpp create mode 100644 test/cpp17sanity/u16string.h.t.cpp create mode 100644 test/cpp17sanity/u16string_stream.h.t.cpp create mode 100644 test/cpp17sanity/u32format_spec.h.t.cpp create mode 100644 test/cpp17sanity/u32string.h.t.cpp create mode 100644 test/cpp17sanity/u32string_stream.h.t.cpp create mode 100644 test/cpp17sanity/unordered_map.h.t.cpp create mode 100644 test/cpp17sanity/unordered_multimap.h.t.cpp create mode 100644 test/cpp17sanity/unordered_multiset.h.t.cpp create mode 100644 test/cpp17sanity/unordered_set.h.t.cpp create mode 100644 test/cpp17sanity/user_type.h.t.cpp create mode 100644 test/cpp17sanity/utility.h.t.cpp create mode 100644 test/cpp17sanity/variant.h.t.cpp create mode 100644 test/cpp17sanity/variant_pool.h.t.cpp create mode 100644 test/cpp17sanity/vector.h.t.cpp create mode 100644 test/cpp17sanity/version.h.t.cpp create mode 100644 test/cpp17sanity/visitor.h.t.cpp create mode 100644 test/cpp17sanity/wformat_spec.h.t.cpp create mode 100644 test/cpp17sanity/wstring.h.t.cpp create mode 100644 test/cpp17sanity/wstring_stream.h.t.cpp create mode 100644 test/file.txt delete mode 100644 test/iar/etl.dep delete mode 100644 test/iar/etl.ewd delete mode 100644 test/iar/etl.ewp delete mode 100644 test/iar/etl.ewt delete mode 100644 test/iar/etl.eww delete mode 100644 test/iar/main.cpp delete mode 100644 test/iar/settings/etl.Debug.cspy.bat delete mode 100644 test/iar/settings/etl.crun delete mode 100644 test/iar/settings/etl.dbgdt delete mode 100644 test/iar/settings/etl.dni delete mode 100644 test/iar/settings/etl.wsdt delete mode 100644 test/iar/settings/etl.wspos create mode 100644 test/runtests.sh create mode 100644 test/test_atomic_clang_sync.cpp create mode 100644 test/test_bresenham_line.cpp create mode 100644 test/test_buffer_descriptors.cpp create mode 100644 test/test_circular_buffer.cpp create mode 100644 test/test_circular_buffer_external_buffer.cpp create mode 100644 test/test_fixed_sized_memory_block_allocator.cpp create mode 100644 test/test_flags.cpp create mode 100644 test/test_format_spec.cpp mode change 100755 => 100644 test/test_map.cpp create mode 100644 test/test_message_router_registry.cpp create mode 100644 test/test_multi_range.cpp mode change 100755 => 100644 test/test_multimap.cpp mode change 100755 => 100644 test/test_multiset.cpp create mode 100644 test/test_parameter_pack.cpp create mode 100644 test/test_queue_lockable.cpp create mode 100644 test/test_queue_lockable_small.cpp mode change 100755 => 100644 test/test_set.cpp create mode 100644 test/test_shared_message.cpp create mode 100644 test/test_span.cpp create mode 100644 test/test_state_chart_with_data_parameter.cpp create mode 100644 test/test_state_chart_with_rvalue_data_parameter.cpp create mode 100644 test/test_string_char_external_buffer.cpp create mode 100644 test/test_string_stream.cpp create mode 100644 test/test_string_stream_u16.cpp create mode 100644 test/test_string_stream_u32.cpp create mode 100644 test/test_string_stream_wchar_t.cpp create mode 100644 test/test_string_u16_external_buffer.cpp create mode 100644 test/test_string_u32_external_buffer.cpp create mode 100644 test/test_string_utilities.cpp create mode 100644 test/test_string_utilities_std.cpp create mode 100644 test/test_string_utilities_std_u16.cpp create mode 100644 test/test_string_utilities_std_u32.cpp create mode 100644 test/test_string_utilities_std_wchar_t.cpp create mode 100644 test/test_string_utilities_u16.cpp create mode 100644 test/test_string_utilities_u32.cpp create mode 100644 test/test_string_utilities_wchar_t.cpp create mode 100644 test/test_string_wchar_t_external_buffer.cpp create mode 100644 test/unit_test_framework.h delete mode 100644 test/vs2017/.gitignore delete mode 100644 test/vs2017/.vs/etl/v15/.gitignore delete mode 100644 test/vs2017/Debug LLVM/.gitignore delete mode 100644 test/vs2017/Debug LLVM/etl.tlog/.gitignore delete mode 100644 test/vs2017/Debug No Unit Tests/.gitignore delete mode 100644 test/vs2017/Debug No Unit Tests/etl.tlog/.gitignore delete mode 100644 test/vs2017/DebugLLVMNoSTL/.gitignore delete mode 100644 test/vs2017/DebugNoSTL/.gitignore delete mode 100644 test/vs2017/cpp.hint delete mode 100644 test/vs2017/etl.sln delete mode 100644 test/vs2017/etl.vcxproj delete mode 100644 test/vs2017/etl.vcxproj.filters delete mode 100644 test/vs2017/random.csv delete mode 100644 test/vs2019/.vs/etl/v15/.gitignore diff --git a/.circleci/config.yml b/.circleci/config.yml index 28e75cee..56da1208 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,26 +1,32 @@ version: 2 - jobs: build: docker: - - image: "debian:stretch" + - image: "rikorose/gcc-cmake:latest" + branches: + only: + - master + - development steps: - - checkout + - checkout: - run: - name: Installing SUDO - command: 'apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/*' - - run: - name: Installing GCC - command: 'apt-get update && apt-get install -y gcc g++' - - run: - name: Install CMAKE - command: 'apt-get update && sudo apt-get install -y cmake' + name: Listing0 + command: 'ls -lrt' - run: name: Creating Build Files - command: 'cmake -H. -Bbuild' + command: 'cmake -Bbuild test/' - run: name: Creating Binary Files command: 'cmake --build build' + - run: + name: Listing1 + command: 'ls -lrt /root/project/build' + - run: + name: Listing2 + command: 'ls -lrt /root/project/build/CMakeFiles' + - run: + name: Listing3 + command: 'cat /root/project/build/CMakeFiles/CMakeOutput.log' - run: name: ETL Unit Testing - command: './bin/etl' \ No newline at end of file + command: './build/etl_tests' diff --git a/.gitattributes b/.gitattributes index 1ff0c423..28d19991 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,11 @@ ############################################################################### * text=auto +############################################################################### +# Declare files that will always have LF line endings on checkout. +############################################################################### +*.sh text eol=lf + ############################################################################### # Set default behavior for command prompt diff. # diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..9c999a1f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +patreon: etlcpp diff --git a/.github/workflows/clang.yml b/.github/workflows/clang.yml new file mode 100644 index 00000000..35b012c1 --- /dev/null +++ b/.github/workflows/clang.yml @@ -0,0 +1,89 @@ +name: clang +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build-clang-9-linux: + name: Clang-9 Linux + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + export CC=clang-9 + export CXX=clang++-9 + cmake -D BUILD_TESTS=ON ./ + clang --version + make + + - name: Run tests + run: ./test/etl_tests + + build-clang-9-linux-no-stl: + name: Clang-9 Linux - No STL + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + cmake -DBUILD_TESTS=ON -DNO_STL=ON ./ + gcc --version + make + + - name: Run tests + run: ./test/etl_tests + + build-clang-10-osx: + name: Clang-10 OSX + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-10.15] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + export CC=clang + export CXX=clang++ + cmake -D BUILD_TESTS=ON ./ + clang --version + make + + - name: Run tests + run: ./test/etl_tests + + build-clang-10-osx-no-stl: + name: Clang-10 OSX - No STL + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-10.15] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + export CC=clang + export CXX=clang++ + cmake -D BUILD_TESTS=ON -DNO_STL=ON ./ + clang --version + make + + - name: Run tests + run: ./test/etl_tests diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml new file mode 100644 index 00000000..5e1ea8f1 --- /dev/null +++ b/.github/workflows/gcc.yml @@ -0,0 +1,45 @@ +name: gcc +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build-gcc-linux: + name: GCC Linux + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-18.04, ubuntu-20.04] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + cmake -DBUILD_TESTS=ON ./ + gcc --version + make + + - name: Run tests + run: ./test/etl_tests + + build-gcc-linux-no-stl: + name: GCC Linux - No STL + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-18.04, ubuntu-20.04] + + steps: + - uses: actions/checkout@v2 + + - name: Build + run: | + cmake -DBUILD_TESTS=ON -DNO_STL=ON ./ + gcc --version + make + + - name: Run tests + run: ./test/etl_tests diff --git a/.github/workflows/vs2019.yml b/.github/workflows/vs2019.yml new file mode 100644 index 00000000..34023277 --- /dev/null +++ b/.github/workflows/vs2019.yml @@ -0,0 +1,51 @@ +name: vs2019 +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build-windows-vs2019: + name: Windows VS2019 Debug + runs-on: [windows-latest] + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 + + - name: Build + run: | + cmake -G "Visual Studio 16 2019" -DBUILD_TESTS=ON ./ + MSBuild.exe -version + MSBuild.exe etl.sln + + - name: Run tests + run: ./test/debug/etl_tests.exe + + build-windows-vs2019-no-stl: + name: Windows VS2019 Debug - No STL + runs-on: [windows-latest] + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 + + - name: Build + run: | + cmake -G "Visual Studio 16 2019" -DBUILD_TESTS=ON -DNO_STL=ON ./ + MSBuild.exe -version + MSBuild.exe etl.sln + + - name: Run tests + run: ./test/debug/etl_tests.exe diff --git a/.gitignore b/.gitignore index 0fa14b13..45c37380 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ examples/ArmTimerCallbacks/Listings examples/ArmTimerCallbacks/Objects examples/ArmTimerCallbacks/DebugConfig build-test-Desktop_x86_windows_msvc2017_pe_32bit-Debug/unittest++/src +buildresults/ ################# ## Eclipse @@ -251,3 +252,37 @@ cmake-build-*/ unittest-cpp *.opendb +build-test-Desktop_x86_windows_msvc2017_pe_32bit-Debug +test/Logs +build-test-Desktop_x86_windows_msvc2019_pe_32bit-Debug +test/vs2019/.vs +Corel Auto-Preserve +.vscode +build-test-Clang_10-Debug +build-test-GCC-Debug +test/kdevelopbuild/unittest++ +test/random_clcg.csv +test/random_hash.csv +test/random_lcg.csv +test/random_lcg.csv +test/random_lcg.csv +test/random_lsfr.csv +test/random_lsfr.csv +test/random_mwc.csv +test/random_pcg.csv +test/random_pcg.csv +test/random_xorshift.csv +test/cmake_install.cmake +test/Makefile +test/vs2019/enc_temp_folder +test/vs2019/.leu +test/etl_test_log.txt +test/vs2019/Debug No Unit Tests +test/vs2019/multi_loop.csv +temp/create_arduino_library.py +examples/FunctionInterruptSimulation-Delegates/vs2019/.vs + +*.db-shm +test/vs2019/.vs/etl/v16/Browse.VC.db-wal +examples/SharedMessage/.vs +examples/QueuedMessageRouter/vs2019/.vs diff --git a/.vs/.gitignore b/.vs/.gitignore deleted file mode 100644 index 35226880..00000000 --- a/.vs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index 38c5f003..00000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": "x86-Debug" -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 9e5a6885..00000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ExpandedNodes": [ - "", - "\\include", - "\\include\\etl", - "\\test" - ], - "SelectedNode": "\\test\\test_to_string.cpp", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 72627167..eef6d0df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,57 +4,14 @@ cmake_minimum_required(VERSION 3.5.0) project(etl) -####################################################################### -# Define an option to allow consumers of the library to -# specify the profile they would like to compile to. If -# not explicitly set CMake will attempt to choose an appropriate -# profile based on the compiler -####################################################################### -set(ETL_PROFILE "DEFAULT" CACHE STRING "Defines what profile header to include. See https://www.etlcpp.com/setup.html" -) - option(BUILD_TESTS "Build unit tests" OFF) +option(NO_STL "No STL" OFF) add_library(etl INTERFACE) -target_include_directories(etl - INTERFACE - include - include/etl/profiles - ) - -if (${ETL_PROFILE} STREQUAL DEFAULT) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set(ETL_PROFILE "PROFILE_GCC_GENERIC") - - elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(ETL_PROFILE "PROFILE_CLANG_GENERIC") - - elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - set(ETL_PROFILE "PROFILE_MSVC") - - elseif (CMAKE_CXX_COMPILER_ID MATCHES "ARMCC") - if (CXX_STANDARD EQUAL 11) - set(ETL_PROFILE "PROFILE_ARMV6") - else () - set(ETL_PROFILE "PROFILE_ARMV5") - endif() - elseif (CMAKE_CXX_COMPILER_ID MATCHES "TI") - set(ETL_PROFILE "PROFILE_TICC") - - else() - message(FATAL_ERROR "Can't generate default profile for compiler: ${CMAKE_CXX_COMPILER_ID}") - endif() -endif() - -message(STATUS "Compiling with ETL profile set to: ${ETL_PROFILE}") - -target_compile_definitions(etl - INTERFACE - ${ETL_PROFILE} - ) - +target_include_directories(etl SYSTEM INTERFACE include) +target_compile_definitions(etl INTERFACE) if (BUILD_TESTS) enable_testing() diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index 9d0eaab8..00000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "configurations": [ - { - "name": "x86-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ - "msvc_x86" - ], - "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", - "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "" - } - ] -} \ No newline at end of file diff --git a/README.md b/README.md index 3429ac9b..c8cc0936 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ Embedded Template Library (ETL) ------------------------- -AppVeyor -[![Build status](https://ci.appveyor.com/api/projects/status/b7jgecv7unqjw4u0/branch/master?svg=true)](https://ci.appveyor.com/project/jwellbelove/etl/branch/master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3c14cd918ccf40008d0bcd7b083d5946)](https://www.codacy.com/manual/jwellbelove/etl?utm_source=github.com&utm_medium=referral&utm_content=ETLCPP/etl&utm_campaign=Badge_Grade) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/jwellbelove/etl) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT) -[![Github All Releases](https://img.shields.io/github/downloads/ETLCPP/etl/total.svg)]() - +![CI](https://github.com/ETLCPP/etl/workflows/vs2019/badge.svg) +![CI](https://github.com/ETLCPP/etl/workflows/gcc/badge.svg) +![CI](https://github.com/ETLCPP/etl/workflows/clang/badge.svg) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3c14cd918ccf40008d0bcd7b083d5946)](https://www.codacy.com/manual/jwellbelove/etl?utm_source=github.com&utm_medium=referral&utm_content=ETLCPP/etl&utm_campaign=Badge_Grade) **Motivation** diff --git a/appveyor.yml b/appveyor.yml index b4f4dc4c..375e1e81 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,7 +2,7 @@ version: 1.0.{build} branches: only: - master -image: Visual Studio 2017 +image: Visual Studio 2019 configuration: - Debug - DebugNoSTL @@ -12,7 +12,7 @@ install: before_build: - cmd: git clone https://github.com/unittest-cpp/unittest-cpp.git c:\projects\unittest-cpp build: - project: test/vs2017/etl.vcxproj + project: test/vs2019/etl.vcxproj verbosity: minimal notifications: - provider: Webhook @@ -20,4 +20,5 @@ notifications: method: POST on_build_success: true on_build_failure: true - on_build_status_changed: true \ No newline at end of file + on_build_status_changed: true + \ No newline at end of file diff --git a/arduino/Embedded_Template_Library.h b/arduino/Embedded_Template_Library.h new file mode 100644 index 00000000..b7ac4789 --- /dev/null +++ b/arduino/Embedded_Template_Library.h @@ -0,0 +1,80 @@ + +#ifndef ETL_EMBEDDED_TEMPLATE_LIBRARY_INCLUDED +#define ETL_EMBEDDED_TEMPLATE_LIBRARY_INCLUDED + +#if defined(TEENSYDUINO) + + #if defined(__AVR_ATmega32U4__) + #define ARDUINO_BOARD "Teensy 2.0" + #elif defined(__AVR_AT90USB1286__) + #define ARDUINO_BOARD "Teensy++ 2.0" + #elif defined(__MK20DX128__) + #define ARDUINO_BOARD "Teensy 3.0" + #elif defined(__MK20DX256__) + #define ARDUINO_BOARD "Teensy 3.2" // and Teensy 3.1 + #elif defined(__MKL26Z64__) + #define ARDUINO_BOARD "Teensy LC" + #elif defined(__MK64FX512__) + #define ARDUINO_BOARD "Teensy 3.5" + #elif defined(__MK66FX1M0__) + #define ARDUINO_BOARD "Teensy 3.6" + #else + #define ARDUINO_BOARD "Unknown" + #endif + +#else // --------------- Arduino ------------------ + + #if defined(ARDUINO_AVR_ADK) + #define ARDUINO_BOARD "Mega Adk" + #elif defined(ARDUINO_AVR_BT) + #define ARDUINO_BOARD "Bt" + #elif defined(ARDUINO_AVR_DUEMILANOVE) + #define ARDUINO_BOARD "Duemilanove" + #elif defined(ARDUINO_AVR_ESPLORA) + #define ARDUINO_BOARD "Esplora" + #elif defined(ARDUINO_AVR_ETHERNET) + #define ARDUINO_BOARD "Ethernet" + #elif defined(ARDUINO_AVR_FIO) + #define ARDUINO_BOARD "Fio" + #elif defined(ARDUINO_AVR_GEMMA) + #define ARDUINO_BOARD "Gemma" + #elif defined(ARDUINO_AVR_LEONARDO) + #define ARDUINO_BOARD "Leonardo" + #elif defined(ARDUINO_AVR_LILYPAD) + #define ARDUINO_BOARD "Lilypad" + #elif defined(ARDUINO_AVR_LILYPAD_USB) + #define ARDUINO_BOARD "Lilypad Usb" + #elif defined(ARDUINO_AVR_MEGA) + #define ARDUINO_BOARD "Mega" + #elif defined(ARDUINO_AVR_MEGA2560) + #define ARDUINO_BOARD "Mega 2560" + #elif defined(ARDUINO_AVR_MICRO) + #define ARDUINO_BOARD "Micro" + #elif defined(ARDUINO_AVR_MINI) + #define ARDUINO_BOARD "Mini" + #elif defined(ARDUINO_AVR_NANO) + #define ARDUINO_BOARD "Nano" + #elif defined(ARDUINO_AVR_NG) + #define ARDUINO_BOARD "NG" + #elif defined(ARDUINO_AVR_PRO) + #define ARDUINO_BOARD "Pro" + #elif defined(ARDUINO_AVR_ROBOT_CONTROL) + #define ARDUINO_BOARD "Robot Ctrl" + #elif defined(ARDUINO_AVR_ROBOT_MOTOR) + #define ARDUINO_BOARD "Robot Motor" + #elif defined(ARDUINO_AVR_UNO) + #define ARDUINO_BOARD "Uno" + #elif defined(ARDUINO_AVR_YUN) + #define ARDUINO_BOARD "Yun" + #elif defined(ARDUINO_SAM_DUE) + #define ARDUINO_BOARD "Due" + #elif defined(ARDUINO_SAMD_ZERO) + #define ARDUINO_BOARD "Zero" + #elif defined(ARDUINO_ARC32_TOOLS) + #define ARDUINO_BOARD "101" + #else + #define ARDUINO_BOARD "Unknown" + #endif +#endif + +#endif \ No newline at end of file diff --git a/arduino/create_arduino_library.py b/arduino/create_arduino_library.py new file mode 100644 index 00000000..b74549e1 --- /dev/null +++ b/arduino/create_arduino_library.py @@ -0,0 +1,72 @@ + +import shutil +import os + +# Assumes this folder structure. +# Folder Variable +# --------------------------------------- +# etl etl_dir +# arduino arduino_dir +# include include_dir +# etl-arduino etl_arduino_dir +# src etl_arduino_src_dir + +print('') +print('Copy ETL files to the etl-arduino repository') +print('') + +# Get the current path of the script +arduino_dir = os.path.dirname(__file__) +print('arduino_dir = ', arduino_dir) + +# Get the root folder of the ETL +etl_dir = os.path.dirname(arduino_dir) +print('etl_dir = ', etl_dir) + +# Get the ETL repository folder +include_dir = os.path.join(etl_dir, 'include') +print('include_dir = ', include_dir) + +# Get the root folder of both repositories +common_dir = os.path.dirname(etl_dir) +print('common_dir = ', common_dir) + +# Get the ETL Arduino repository folder +etl_arduino_dir = os.path.join(common_dir, 'etl-arduino') +print('etl_arduino_dir = ', etl_arduino_dir) + +# Get the ETL Arduino src repository folder +etl_arduino_src_dir = os.path.join(etl_arduino_dir, 'src') +print('etl_arduino_src_dir = ', etl_arduino_src_dir) + +print('') + +# Copy the library properties +filename = 'library.properties' +source = os.path.join(etl_dir, filename) +destination = os.path.join(etl_arduino_dir, filename) +print('Copy the library properties') +print(' From :', source) +print(' To :', destination) +shutil.copyfile(source, destination) + +print('') + +# Copy the Arduino ETL header +filename = 'Embedded_Template_Library.h' +source = os.path.join(arduino_dir, filename) +destination = os.path.join(etl_arduino_src_dir, filename) +print('Copy the Arduino ETL header') +print(' From :', source) +print(' To :', destination) +shutil.copyfile(source, destination) + +print('') + +# Copy the ETL headers +source = include_dir +destination = etl_arduino_src_dir +print('Copy the ETL headers') +print(' From :', source) +print(' To :', destination) +shutil.copytree(source, destination, dirs_exist_ok = True) diff --git a/conanfile.py b/conanfile.py index 79a6824d..100decc6 100755 --- a/conanfile.py +++ b/conanfile.py @@ -20,10 +20,10 @@ class EmbeddedTemplateLibraryConan(ConanFile): name = "embedded-template-library" version = get_version_from_git_tag() license = "MIT" - author = "John Wellbelove " + author = "John Wellbelove " url = "https://github.com/ETLCPP/etl" description = "A C++ template library for embedded applications" - topics = ("embedded", "template", "container") + topics = ("C++", "embedded", "template", "container", "utility", "framework", "messaging") # Source info scm = { diff --git a/etl.ico b/etl.ico deleted file mode 100644 index fe0e36656ce6391b77d697e96925fc43bbdd03b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 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 ZnO$$=8Zq}{0B09;aG#II(>nk diff --git a/etl.pspimage b/etl.pspimage deleted file mode 100644 index a5329e63b7d3ef3fa5a4a7f010343d07226fd1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11544 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 AH~;_u diff --git a/etl.xar b/etl.xar deleted file mode 100644 index cbfaa863b4e107c0393945fa6b67ddc39eb0b685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28896 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 Oe0<^L&#is1|Nb9*K*@Um diff --git a/etl16.png b/etl16.png deleted file mode 100644 index 44cad996510bf6dcd0beb8ad5e024b331bb9c86a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15993 zcmeI3Z)_Y#6~Lb_cAOYHDa2_S=il|}2&ZMew|Bm?Z#iFO>;$`TiE$j+NkMdPZ_Zxj z?)G}Owl9`YQ%Go=3JH)1H zcJH6Zz9E7lzU)YEZ{NImZ)ScoZ*ITLOT&l1*wWP21OP2Vg99V@`w*2)8}Yes!Bp^P zb7t^(4q(e4sMP)7i7mSTLYKACabrCCWm(lzol0Dfk+ zj}=$OcUmoa+*T9gWUr@>cIY0D4!isHEO7@qgMunalDj+9DFu4`zQE_)KCcuIy&+NZ z3SLQ;yt2>hE*4Lu3E#rmctRc-I8^KowO-GpVPs@coSB*Fobh++*$Gh!g+ij&C;EH> zwh(fs(uR^3(z(a%Af-41B&TMzjG^giH;t>r^eLm)s^UP1{8xta6bkG zuTSuGk4oLLKP3ACC#wAIMvQw@k86ojRqlSl8yxk94c_K)34m$A~I)D?UY#;$2-r%qzu&o>(mA3#w|++wHT^MWfa3YeEm`>J&{6 z3~iqzab3mmm0<<&j8KD$PaystNsuHG5JGXOOHhJ-zuMKMNPZtq!yac|LM$ZtCE{0u!Jt~|Vx2H+x*F7SxIIr* zZCl*D)=_qpJiEHKWJqe(k(5!gIYJYz*Hg;4@)=e>qNtCRxU!}? ztg>g(OwU*%rAkC{o5u8~i66stjP|D2vMW|S=Ho50QSAX#olUG2t(4~z8N zPip^zHOMK`|J@2aSVH}0E5IH}|GyQe>|J$INl%b?L@aIFQpJNUn!S{(^Qn}hYx6Hm z|AS=AUEEBHl`~RUTvJ!+*=|2hb1*q&wGRcoSnx{)OVPF3%(@=uyH=Z7*NW${v}Q!` z6txD*R9AV?KT7*hKZ@UUBoYh+{DH8@RqQ zqNBZ3RbO9L`q{PkZHJ$gV)?srO=gzQu21r%GNVs2Dih1;gaN`=9b9}qjMc%#0O6|+ zEfmC4@KpyFpATboa4|sms)LKqhp{@i7$AJr!NuppSRGsp5Wec*;`3pw4lV`= zUv+Tt`7l-o7XyT^I=J|J7^{Pe0m4@uTzo!^)xpI8;j0cVJ|D*F;9`LARR*bS5xJtCQ0M<%o)6g zIUT=r1n+RV)xnV{!0dj2)87KPZ{qK}08?IoTh9Q_GW6N~xIGZt?EQeEr7F z8#?~{GXe{@{%YAiUS5XK3E+Dq*kKefXge!(ob>goU*Tkw)=u}nAb z!SH+F<H)h82A5-O~pC=B;o>5Ue)W_wI#`0|&rF zD9>KK3L$KB7A?O+`J>gM`0$ZCg`TH~`H@+>eE#XDt?ALJP-&pk+37b&zik%kH$L11 zSKpX}MI#BDTeidbwl)|e1TMbz8ocr5o46_~&{`zVZ*8@H>EqVz+xGigZ^1{!+9h1#23*tneONJu@(9W=P=+sGhOZh1+?|_) zvuDqO%jE)}&xaO(SI?b;@tZec>BIM7_UD&i$L+fS$6hoGu)D{^VAjxZQLLc{Mn-B< z{SYm3G+}y`TLl*#Hr=9&C=nDF%Ihe9x^Mv=^>}bb?VvvQ9M)hN8-sDw_qRO^mk{v2 z_U%@C+lbHKqnt*OQC>#5{`T8&?bJqmV6cjDcJd8+|^ zJdg4l6a!^13T1Qpy{iBVbMSoO25NR${9xYRi7U&{()ws0EWB$c(|xonC_hG_8Azx2 ztG_J5_r5d*<~6u-N9%>jmczEE#7oPd%zW^t+a`ylL diff --git a/etl48.png b/etl48.png deleted file mode 100644 index 03dcffbb4dfc4d2bf45be77b0556cc9ad53ff8b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24217 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 E59?JFa{vGU diff --git a/examples/ArmTimerCallbacks - C++/etl_profile.h b/examples/ArmTimerCallbacks - C++/etl_profile.h index dc157287..84bbd550 100644 --- a/examples/ArmTimerCallbacks - C++/etl_profile.h +++ b/examples/ArmTimerCallbacks - C++/etl_profile.h @@ -10,6 +10,6 @@ #define ETL_CALLBACK_TIMER_USE_ATOMIC_LOCK #define ETL_NO_STL -#include "etl/profiles/auto.h" +//#include "etl/profiles/auto.h" #endif diff --git a/examples/Debounce/Debounce.sln b/examples/Debounce/Debounce.sln deleted file mode 100644 index 6d3f1698..00000000 --- a/examples/Debounce/Debounce.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Debounce", "Debounce.vcxproj", "{2D9F7027-A2E4-4558-869E-A09815D85E02}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Debug|x64.ActiveCfg = Debug|x64 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Debug|x64.Build.0 = Debug|x64 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Debug|x86.ActiveCfg = Debug|Win32 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Debug|x86.Build.0 = Debug|Win32 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Release|x64.ActiveCfg = Release|x64 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Release|x64.Build.0 = Release|x64 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Release|x86.ActiveCfg = Release|Win32 - {2D9F7027-A2E4-4558-869E-A09815D85E02}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/Debounce/Debounce.vcxproj.filters b/examples/Debounce/Debounce.vcxproj.filters deleted file mode 100644 index ac927ede..00000000 --- a/examples/Debounce/Debounce.vcxproj.filters +++ /dev/null @@ -1,25 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Header Files - - - \ No newline at end of file diff --git a/examples/FunctionInterruptSimulation-Delegates/CMakeLists.txt b/examples/FunctionInterruptSimulation-Delegates/CMakeLists.txt new file mode 100644 index 00000000..68a3639c --- /dev/null +++ b/examples/FunctionInterruptSimulation-Delegates/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(FunctionInterruptSimulation) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES FunctionInterruptSimulation.cpp) + +add_executable(FunctionInterruptSimulation ${SOURCE_FILES}) +target_include_directories(FunctionInterruptSimulation + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET FunctionInterruptSimulation PROPERTY CXX_STANDARD 17) + diff --git a/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.sln b/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.sln new file mode 100644 index 00000000..26180392 --- /dev/null +++ b/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FunctionInterruptSimulation-Delegates", "FunctionInterruptSimulation-Delegates.vcxproj", "{5157DB15-C255-4E47-9FB1-AF388437F90F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Debug|x64.ActiveCfg = Debug|x64 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Debug|x64.Build.0 = Debug|x64 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Debug|x86.ActiveCfg = Debug|Win32 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Debug|x86.Build.0 = Debug|Win32 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Release|x64.ActiveCfg = Release|x64 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Release|x64.Build.0 = Release|x64 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Release|x86.ActiveCfg = Release|Win32 + {5157DB15-C255-4E47-9FB1-AF388437F90F}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {260225EB-60CB-44CC-A60C-16A23BBC10EB} + EndGlobalSection +EndGlobal diff --git a/examples/Debounce/Debounce.vcxproj b/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.vcxproj similarity index 55% rename from examples/Debounce/Debounce.vcxproj rename to examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.vcxproj index e6162ff3..67906a09 100644 --- a/examples/Debounce/Debounce.vcxproj +++ b/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.vcxproj @@ -1,5 +1,5 @@ - - + + Debug @@ -18,37 +18,45 @@ x64 + + + + + + - {2D9F7027-A2E4-4558-869E-A09815D85E02} - Debounce - 8.1 + 15.0 + {5157DB15-C255-4E47-9FB1-AF388437F90F} + Win32Proj + FunctionInterruptSimulation + 10.0 Application true - v140 - MultiByte + v142 + Unicode Application false - v140 + v142 true - MultiByte + Unicode Application true - v140 - MultiByte + v142 + Unicode Application false - v140 + v142 true - MultiByte + Unicode @@ -68,58 +76,81 @@ - + + true + + + true + + + false + + + false + + Use Level3 Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\cores\arduino;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\cores\arduino\avr;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\cores\arduino\USB;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\variants\arduino_zero;D:\Users\John\Documents\Programming\GitHub\etl\examples\Debounce;C:\Program Files (x86)\Arduino\libraries;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\libraries;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\qdmsbpkv.c4h\Micro Platforms\default\debuggers;D:\Users\John\Documents\Programming\Arduino\libraries;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel/CMSIS/Include/;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel/Device/ATMEL/;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\c++\4.8.3;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\c++\4.8.3\arm-none-eabi;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\c++\4.8.3\bits;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\sys;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd\1.6.5\system;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd/avr;C:\Users\John\AppData\Local\arduino15\packages\arduino\hardware\samd/usb;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\lib\gcc\arm-none-eabi\4.8.3\include;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\include;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio;C:\Users\John\AppData\Local\arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component;%(AdditionalIncludeDirectories) - D:\Users\John\Documents\Programming\GitHub\etl\examples\Debounce\__vm\.Debounce.vsarduino.h;%(ForcedIncludeFiles) - F_CPU=48000000L;ARDUINO=10607;ARDUINO_SAMD_ZERO;ARDUINO_ARCH_SAMD;__SAMD21G18A__;USB_VID=0x2341;USB_PID=0x804d;USBCON;__cplusplus=201103L;%(PreprocessorDefinitions) + ../../../src + + Console + true + + NotUsing Level3 Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ../../../include;%(AdditionalIncludeDirectories) + stdcpp17 + + Console + true + + Use Level3 MaxSpeed true true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + Console true true + true + Use Level3 MaxSpeed true true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + Console true true + true - - - CppCode - - - - - diff --git a/examples/FunctionInterruptSimulation/CMakeLists.txt b/examples/FunctionInterruptSimulation/CMakeLists.txt new file mode 100644 index 00000000..68a3639c --- /dev/null +++ b/examples/FunctionInterruptSimulation/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(FunctionInterruptSimulation) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES FunctionInterruptSimulation.cpp) + +add_executable(FunctionInterruptSimulation ${SOURCE_FILES}) +target_include_directories(FunctionInterruptSimulation + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET FunctionInterruptSimulation PROPERTY CXX_STANDARD 17) + diff --git a/examples/QueuedFSM/CMakeLists.txt b/examples/QueuedFSM/CMakeLists.txt new file mode 100644 index 00000000..5cd13b05 --- /dev/null +++ b/examples/QueuedFSM/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(queued_fsm) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES QueuedFSM.cpp) + +add_executable(queued_fsm ${SOURCE_FILES}) +target_include_directories(queued_fsm + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET queued_fsm PROPERTY CXX_STANDARD 17) + diff --git a/examples/QueuedMessageRouter/CMakeLists.txt b/examples/QueuedMessageRouter/CMakeLists.txt new file mode 100644 index 00000000..2c11fe31 --- /dev/null +++ b/examples/QueuedMessageRouter/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(queued_message_router) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES QueuedMessageRouter.cpp) + +add_executable(queued_message_router ${SOURCE_FILES}) +target_include_directories(queued_message_router + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET queued_message_router PROPERTY CXX_STANDARD 17) + diff --git a/examples/QueuedMessageRouter/QueuedMessageRouter.cpp b/examples/QueuedMessageRouter/QueuedMessageRouter.cpp index f635709e..a392db95 100644 --- a/examples/QueuedMessageRouter/QueuedMessageRouter.cpp +++ b/examples/QueuedMessageRouter/QueuedMessageRouter.cpp @@ -67,13 +67,16 @@ public: if (accepts(msg_)) { // Place in queue. + + Item item(&sender_, msg_); + queue.emplace(&sender_, msg_); - std::cout << "Queueing message " << int(msg_.message_id) << std::endl; + std::cout << "Queueing message " << int(msg_.get_message_id()) << std::endl; } else { - std::cout << "Ignoring message " << int(msg_.message_id) << std::endl; + std::cout << "Ignoring message " << int(msg_.get_message_id()) << std::endl; } } @@ -85,7 +88,7 @@ public: Item& item = queue.front(); etl::imessage& msg = item.packet.get(); etl::imessage_router& sender = *item.sender; - std::cout << "Processing message " << int(msg.message_id) << std::endl; + std::cout << "Processing message " << int(msg.get_message_id()) << std::endl; // Call the base class's receive function. // This will route it to the correct on_receive handler. @@ -98,25 +101,25 @@ public: //*************************************************************************** void on_receive(etl::imessage_router& sender, const Message1& msg) { - std::cout << " Received message " << int(msg.message_id) << " : '" << msg.i << "'" << std::endl; + std::cout << " Received message " << int(msg.get_message_id()) << " : '" << msg.i << "'" << std::endl; } //*************************************************************************** void on_receive(etl::imessage_router& sender, const Message2& msg) { - std::cout << " Received message " << int(msg.message_id) << " : '" << msg.d << "'" << std::endl; + std::cout << " Received message " << int(msg.get_message_id()) << " : '" << msg.d << "'" << std::endl; } //*************************************************************************** void on_receive(etl::imessage_router& sender, const Message3& msg) { - std::cout << " Received message " << int(msg.message_id) << " : '" << msg.s << "'" << std::endl; + std::cout << " Received message " << int(msg.get_message_id()) << " : '" << msg.s << "'" << std::endl; } //*************************************************************************** void on_receive_unknown(etl::imessage_router& sender, const etl::imessage& msg) { - std::cout << " Received unknown message " << int(msg.message_id) << std::endl; + std::cout << " Received unknown message " << int(msg.get_message_id()) << std::endl; } private: diff --git a/examples/QueuedMessageRouter/vs2017/etl_profile.h b/examples/QueuedMessageRouter/etl_profile.h similarity index 91% rename from examples/QueuedMessageRouter/vs2017/etl_profile.h rename to examples/QueuedMessageRouter/etl_profile.h index c96719fd..9839404e 100644 --- a/examples/QueuedMessageRouter/vs2017/etl_profile.h +++ b/examples/QueuedMessageRouter/etl_profile.h @@ -33,12 +33,8 @@ SOFTWARE. #define ETL_THROW_EXCEPTIONS #define ETL_VERBOSE_ERRORS -#define ETL_CHECK_PUSH_POP -#define ETL_ISTRING_REPAIR_ENABLE -#define ETL_IVECTOR_REPAIR_ENABLE -#define ETL_IDEQUE_REPAIR_ENABLE -#ifdef _MSC_VER +#if defined(_MSC_VER) #include "etl/profiles/msvc_x86.h" #else #include "etl/profiles/gcc_windows_x86.h" diff --git a/examples/QueuedMessageRouter/vs2017/.vs/QueuedMessageRouter.sqlite b/examples/QueuedMessageRouter/vs2017/.vs/QueuedMessageRouter.sqlite deleted file mode 100644 index 2572d76ef2a2e251849d46ab244b5419711b8b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278528 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 T1J@#W6U3GnI`Pn%931~YCDseX diff --git a/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj.filters b/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj.filters deleted file mode 100644 index ef62273b..00000000 --- a/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj.filters +++ /dev/null @@ -1,27 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - Header Files - - - \ No newline at end of file diff --git a/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.sln b/examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.sln similarity index 100% rename from examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.sln rename to examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.sln diff --git a/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj b/examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.vcxproj similarity index 96% rename from examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj rename to examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.vcxproj index b697a59e..65dad150 100644 --- a/examples/QueuedMessageRouter/vs2017/QueuedMessageRouter.vcxproj +++ b/examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.vcxproj @@ -23,32 +23,32 @@ {2BB47D48-5EFC-4C38-B2BE-002172F00E3B} Win32Proj QueuedMessageRouter - 10.0.18362.0 + 10.0 Application true - v141 + v142 Unicode Application false - v141 + v142 true Unicode Application true - v141 + v142 Unicode Application false - v141 + v142 true Unicode @@ -150,7 +150,7 @@ - + diff --git a/examples/Scheduler/CMakeLists.txt b/examples/Scheduler/CMakeLists.txt new file mode 100644 index 00000000..98b79c97 --- /dev/null +++ b/examples/Scheduler/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(scheduler) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES Scheduler.cpp) + +add_executable(scheduler ${SOURCE_FILES}) +target_include_directories(scheduler + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET scheduler PROPERTY CXX_STANDARD 17) + diff --git a/examples/Scheduler/Scheduler.cpp b/examples/Scheduler/Scheduler.cpp new file mode 100644 index 00000000..015822ae --- /dev/null +++ b/examples/Scheduler/Scheduler.cpp @@ -0,0 +1,184 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2020 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. +******************************************************************************/ + +//***************************************************************************** +// This example demonstrates the basic method to schedule tasks. +// Experiment with the different scheduling policies. +//***************************************************************************** + +#include "etl/scheduler.h" +#include "etl/task.h" +#include "etl/function.h" + +#include +#include + +//***************************************************************************** +// Task 1. Lowest priority. +//***************************************************************************** +class Task1 : public etl::task +{ +public: + + //************************************* + Task1() + : task(1) + , work(3) + { + + } + + //************************************* + uint32_t task_request_work() const + { + return work; // How much work do we still have to do? This could be a message queue length. + } + + //************************************* + void task_process_work() + { + std::cout << "Task1 : Process work : " << work << std::endl; + --work; + } + +private: + + uint32_t work; +}; + +//***************************************************************************** +// Task 2. Highest priority. +//***************************************************************************** +class Task2 : public etl::task +{ +public: + + //************************************* + Task2() + : task(2) + , work(4) + { + + } + + //************************************* + uint32_t task_request_work() const + { + return work; // How much work do we still have to do? This could be a message queue length. + } + + //************************************* + void task_process_work() + { + std::cout << "Task2 : Process work : " << work << std::endl; + --work; + } + +private: + + uint32_t work; +}; + +//***************************************************************************** +// The idle handler. +//***************************************************************************** +class Idle +{ +public: + + //************************************* + Idle(etl::ischeduler& scheduler_) + : scheduler(scheduler_) + { + + } + + //************************************* + void IdleCallback() + { + std::cout << "Idle callback" << std::endl; + scheduler.exit_scheduler(); + std::cout << "Exiting the scheduler" << std::endl; + } + +private: + + etl::ischeduler& scheduler; +}; + +//***************************************************************************** +// The watchdog handler. +//***************************************************************************** +void WatchdogCallback() +{ + std::cout << "Watchdog callback" << std::endl; +} + +//***************************************************************************** +// The scheduler. +// Maximum of two tasks. +// +// Try the other scheduler policies to see how scheduling differs. +// etl::scheduler_policy_sequential_single +// etl::scheduler_policy_sequential_multiple +// etl::scheduler_policy_highest_priority +// etl::scheduler_policy_most_work +//***************************************************************************** +class Scheduler : public etl::scheduler +{ +}; + +//***************************************************************************** +// The test application. +//***************************************************************************** +int main() +{ + Scheduler scheduler; + + Task1 task1; + Task2 task2; + + Idle idleHandler(scheduler); + + etl::function_mv idleCallback(idleHandler); // Member function, no parameters, returning void. + etl::function_fv watchdogCallback; // Global function, no parameters, returning void. + + scheduler.add_task(task1); + scheduler.add_task(task2); + scheduler.set_idle_callback(idleCallback); + scheduler.set_watchdog_callback(watchdogCallback); + + std::cout << "Starting the scheduler" << std::endl; + + scheduler.start(); + + std::cout << "Exiting the application" << std::endl; + + return 0; +} + diff --git a/include/etl/profiles/etl_profile.h b/examples/Scheduler/etl_profile.h similarity index 59% rename from include/etl/profiles/etl_profile.h rename to examples/Scheduler/etl_profile.h index bce6871d..735de7fc 100644 --- a/include/etl/profiles/etl_profile.h +++ b/examples/Scheduler/etl_profile.h @@ -7,7 +7,7 @@ Embedded Template Library. https://github.com/ETLCPP/etl https://www.etlcpp.com -Copyright(c) 2017 jwellbelove, scott-eddy +Copyright(c) 2020 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 @@ -27,38 +27,17 @@ 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_PROFILE_H__ #define __ETL_PROFILE_H__ -#if defined(PROFILE_MSVC) - #include "msvc_x86.h" -#elif defined(PROFILE_GCC_GENERIC) - #include "gcc_generic.h" -#elif defined(PROFILE_GCC_LINUX_X86) - #include "gcc_linux_x86.h" -#elif defined(PROFILE_GCC_WINDOWS_X86) - #include "gcc_windows_x86.h" -#elif defined(PROFILE_CLANG_GENERIC) - #include "clang_generic.h" -#elif defined(PROFILE_ARM_V5_GENERIC) - #include "armv5.h" -#elif defined(PROFILE_ARM_V6_GENERIC) - #include "armv6.h" -#elif defined(PROFILE_ARDUINO) - #include "arduino_arm.h" -#elif defined(PROFILE_TICC) - #include "ticc.h" -#elif defined(PROFILE_CPP03_GENERIC) - #include "cpp03.h" -#elif defined(PROFILE_CPP11_GENERIC) - #include "cpp11.h" -#elif defined(PROFILE_CPP14_GENERIC) - #include "cpp14.h" -#elif defined(PROFILE_CPP17_GENERIC) - #include "cpp17.h" -#elif defined(PROFILE_CUSTOM) - #include "custom_profile.h" -#else - #include "auto.h" + +#define ETL_THROW_EXCEPTIONS +#define ETL_VERBOSE_ERRORS + +#if defined(_MSC_VER) + #include "etl/profiles/msvc_x86.h" +#elif defined(__GNUC__) + #include "etl/profiles/gcc_generic.h" #endif -#endif // __ETL_PROFILE_H_ +#endif diff --git a/examples/Scheduler/vs2017/Scheduler.sln b/examples/Scheduler/vs2017/Scheduler.sln new file mode 100644 index 00000000..994c596f --- /dev/null +++ b/examples/Scheduler/vs2017/Scheduler.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.10 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Scheduler", "Scheduler.vcxproj", "{2BB47D48-5EFC-4C38-B2BE-002172F00E3B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x64.ActiveCfg = Debug|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x86.ActiveCfg = Debug|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x86.Build.0 = Debug|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x64.ActiveCfg = Release|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x64.Build.0 = Release|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x86.ActiveCfg = Release|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {98B87835-6672-45D4-95BF-CC5C22C87D2C} + EndGlobalSection +EndGlobal diff --git a/examples/Scheduler/vs2017/Scheduler.vcxproj b/examples/Scheduler/vs2017/Scheduler.vcxproj new file mode 100644 index 00000000..c70dabcd --- /dev/null +++ b/examples/Scheduler/vs2017/Scheduler.vcxproj @@ -0,0 +1,160 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B} + Win32Proj + Scheduler + 10.0.18362.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include;../vs2017 + stdcpp17 + + + Console + true + + + + + NotUsing + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include;../vs2017 + + stdcpp17 + + + Console + true + + + + + Use + Level3 + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + %(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/Scheduler/vs2019/Scheduler.sln b/examples/Scheduler/vs2019/Scheduler.sln new file mode 100644 index 00000000..994c596f --- /dev/null +++ b/examples/Scheduler/vs2019/Scheduler.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.10 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Scheduler", "Scheduler.vcxproj", "{2BB47D48-5EFC-4C38-B2BE-002172F00E3B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x64.ActiveCfg = Debug|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x86.ActiveCfg = Debug|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Debug|x86.Build.0 = Debug|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x64.ActiveCfg = Release|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x64.Build.0 = Release|x64 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x86.ActiveCfg = Release|Win32 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {98B87835-6672-45D4-95BF-CC5C22C87D2C} + EndGlobalSection +EndGlobal diff --git a/examples/Scheduler/vs2019/Scheduler.vcxproj b/examples/Scheduler/vs2019/Scheduler.vcxproj new file mode 100644 index 00000000..8e00efa6 --- /dev/null +++ b/examples/Scheduler/vs2019/Scheduler.vcxproj @@ -0,0 +1,160 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {2BB47D48-5EFC-4C38-B2BE-002172F00E3B} + Win32Proj + Scheduler + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include;../vs2017 + stdcpp17 + + + Console + true + + + + + NotUsing + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include;../vs2017 + + stdcpp17 + + + Console + true + + + + + Use + Level3 + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + %(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/SharedMessage/CMakeLists.txt b/examples/SharedMessage/CMakeLists.txt new file mode 100644 index 00000000..eb3f6aa1 --- /dev/null +++ b/examples/SharedMessage/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.5.0) +project(SharedMessage) + +add_definitions(-DETL_DEBUG) + +include_directories(${UTPP_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/../../include) + +set(SOURCE_FILES SharedMessage.cpp) + +add_executable(SharedMessage ${SOURCE_FILES}) +target_include_directories(SharedMessage + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} + ) + +set_property(TARGET SharedMessage PROPERTY CXX_STANDARD 17) + diff --git a/examples/SharedMessage/SharedMessage.cpp b/examples/SharedMessage/SharedMessage.cpp new file mode 100644 index 00000000..8f67bf13 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.cpp @@ -0,0 +1,285 @@ +//***************************************************************************** +// Shared message example +//***************************************************************************** + +#include "etl/shared_message.h" +#include "etl/message.h" +#include "etl/reference_counted_message_pool.h" +#include "etl/message_router.h" +#include "etl/message_bus.h" +#include "etl/fixed_sized_memory_block_allocator.h" +#include "etl/queue.h" + +#include +#include +#include +#include + +constexpr etl::message_router_id_t RouterId1 = 1U; +constexpr etl::message_router_id_t RouterId2 = 2U; + +//***************************************************************************** +// Message1 +//***************************************************************************** +struct Message1 : public etl::message<1> +{ + Message1(std::string s_) + : s(s_) + { + + } + + std::string s; +}; + +//***************************************************************************** +// Message2 +//***************************************************************************** +struct Message2 : public etl::message<2> +{ + Message2(std::string s_) + : s(s_) + { + + } + + std::string s; + char data[100]; +}; + +//***************************************************************************** +// Message3 +//***************************************************************************** +struct Message3 : public etl::message<3> +{ + Message3(std::string s_) + : s(s_) + { + + } + + std::string s; +}; + +//***************************************************************************** +// Prints the shared message +//***************************************************************************** +void Print(const std::string& prefix, etl::shared_message sm) +{ + std::cout << prefix << " : Message Id = " << int(sm.get_message().get_message_id()) << "\n"; +} + +//***************************************************************************** +// This router accepts Message1, Message2 and Message3 types. +// If a shared message it received, it will be processed immediately. +//***************************************************************************** +class MessageRouter1 : public etl::message_router +{ +public: + + //**************************************** + MessageRouter1() + : message_router(RouterId1) + { + } + + //**************************************** + void on_receive(const Message1& msg) + { + std::cout << "MessageRouter1 : on_receive Message1 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(const Message2& msg) + { + std::cout << "MessageRouter1 : on_receive Message2 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(const Message3& msg) + { + std::cout << "MessageRouter1 : on_receive Message3 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive_unknown(const etl::imessage& msg) + { + std::cout << "MessageRouter1 : on_receive Unknown\n"; + } +}; + +//***************************************************************************** +// This router accepts Message1, Message2 and Message3 types. +// If a shared message it received it will queue them. +// The messages will be processed when process_queue() is called. +//***************************************************************************** +class MessageRouter2 : public etl::message_router +{ +public: + + using base_t = etl::message_router; + + //**************************************** + MessageRouter2() + : message_router(RouterId2) + { + } + + using base_t::receive; + + //**************************************** + // Overridden receive. + // Puts the shared messages into a queue. + void receive(etl::shared_message shared_msg) override + { + if (!queue.full()) + { + Print("MessageRouter2 : Queueing shared message", shared_msg); + + queue.push(shared_msg); + } + } + + //**************************************** + // Processes the queued shared messages. + void process_queue() + { + while (!queue.empty()) + { + // Get the shared message from the queue. + etl::shared_message shared_msg = queue.front(); + + Print("MessageRouter2 : Process queued shared message", shared_msg); + + // Send it to the base implementation for routing. + base_t::receive(shared_msg); + + queue.pop(); + } + } + + //**************************************** + void on_receive(const Message1& msg) + { + std::cout << "MessageRouter2 : on_receive Message1 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(const Message2& msg) + { + std::cout << "MessageRouter2 : on_receive Message2 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(const Message3& msg) + { + std::cout << "MessageRouter2 : on_receive Message3 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive_unknown(const etl::imessage& msg) + { + std::cout << "MessageRouter2 : on_receive Unknown\n"; + } + +private: + + etl::queue queue; +}; + +//***************************************************************************** +// A message bus that can accomodate two subscribers. +//***************************************************************************** +struct Bus : public etl::message_bus<2U> +{ +}; + +//***************************************************************************** +// Define the routers and bus. +//***************************************************************************** +MessageRouter1 router1; +MessageRouter2 router2; +Bus bus; + +//***************************************************************************** +// The thread safe message pool. Uses atomic uint32_t for counting. +class MessagePool : public etl::reference_counted_message_pool +{ +public: + + MessagePool(etl::imemory_block_allocator& allocator) + : reference_counted_message_pool(allocator) + { + } + + // Called before the memory block allocator is accessed. + void lock() override + { + mut.lock(); + } + + // Called after the memory block allocator has been accessed. + void unlock() override + { + mut.unlock(); + } + +private: + + std::mutex mut; +}; + +//***************************************************************************** +// The memory block allocator that supplies the pool with memory +// to store reference counted messages in. + +// The reference counted message parameters type for the messages we will use. +using message_parameters_small = MessagePool::pool_message_parameters; +using message_parameters_large = MessagePool::pool_message_parameters; + +constexpr size_t max_size_small = message_parameters_small::max_size; +constexpr size_t max_alignment_small = message_parameters_small::max_alignment; + +constexpr size_t max_size_large = message_parameters_large::max_size; +constexpr size_t max_alignment_large = message_parameters_large::max_alignment; + +// A fixed memory block allocator for 4 items, using the parameters from the smaller messages. +etl::fixed_sized_memory_block_allocator memory_allocator; + +// A fixed memory block allocator for 4 items, using the parameters from the larger message. +etl::fixed_sized_memory_block_allocator memory_allocator_successor; + +//***************************************************************************** +// The pool that supplies reference counted messages. +// Uses memory_allocator as its allocator. +//***************************************************************************** +MessagePool message_pool(memory_allocator); + +//***************************************************************************** +// A statically allocated reference counted message that is never allocated or released by a pool. +// Contains a copy of Message3("Three"). +//***************************************************************************** +etl::persistent_message pm3(Message3("Three")); + +//***************************************************************************** +int main() +{ + // If memory_allocator can't allocate, then try memory_allocator_successor. + memory_allocator.set_successor(memory_allocator_successor); + + Message1 m1("One"); + Message2 m2("Two"); + + etl::shared_message sm1(message_pool, m1); // Created a shared message by allocating a reference counted message from message_pool containing a copy of m1. + etl::shared_message sm2(message_pool, m2); // Created a shared message by allocating a reference counted message from message_pool containing a copy of m2. + etl::shared_message sm3(pm3); // Created a shared message from a statically allocated persistent message. + + bus.subscribe(router1); // Subscribe router1 to the bus. + bus.subscribe(router2); // Subscribe router2 to the bus. + + bus.receive(sm1); // Send sm1 to the bus for distribution to the routers. + bus.receive(sm2); // Send sm2 to the bus for distribution to the routers. + bus.receive(sm3); // Send sm3 to the bus for distribution to the routers. + + router2.process_queue(); // Allow router2 to process its queued messages. +} diff --git a/examples/SharedMessage/SharedMessage.sln b/examples/SharedMessage/SharedMessage.sln new file mode 100644 index 00000000..fec1c6e1 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30804.86 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SharedMessage", "SharedMessage.vcxproj", "{0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x64.ActiveCfg = Debug|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x64.Build.0 = Debug|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x86.ActiveCfg = Debug|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x86.Build.0 = Debug|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x64.ActiveCfg = Release|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x64.Build.0 = Release|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x86.ActiveCfg = Release|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F7B7515D-19FA-42D4-9BA2-5F85A7FB7779} + EndGlobalSection +EndGlobal diff --git a/examples/SharedMessage/SharedMessage.vcxproj b/examples/SharedMessage/SharedMessage.vcxproj new file mode 100644 index 00000000..24249971 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {0bdb4f2a-47e7-4105-a66a-6dff8a76587b} + SharedMessage + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + D:\Users\John\Documents\Programming\GitHub\etl\include;%(AdditionalIncludeDirectories) + stdcpp17 + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/SharedMessage/SharedMessage.vcxproj.filters b/examples/SharedMessage/SharedMessage.vcxproj.filters new file mode 100644 index 00000000..673bfd20 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/examples/SharedMessage/etl_profile.h b/examples/SharedMessage/etl_profile.h new file mode 100644 index 00000000..e69de29b diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 2cf75c1d8fd21319ad87182ae6f301ee04e66f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)*F-(&|6vwY<3zk%hX(ayLxS`!k#=6A36zW0CcySsOc8St}O z8Acboah$O>#@HDE7d#a|3>(I~&65?xTs-BKK;e7RSE{EEa}D^xMCnshE4|blrLX#6 zU0iuNP$;G}G9EJ!QvHPu|M$TK&_gcQKF!Z9Qe$H+#(?l=>G+wV2F&{tym_Y+A z-rgngboaV3ujR+3&33<3LL?99xh)VH@kKJhiO?ty+x>BU+_-Fvb|EEbiTqXu2SN-u_N(Dy*! z0nGu(k=e{h*B8j+xk#ZbfWWX71 zCr9|VxSO|FI%)D!8Q=DlGMNP#o6TnBw}-=F^7{jnNa)nmB=-3k_yv6%^r!iopo{y4 zdZp&5VQuY!s+)lod)x=T=$}!ZPYiNP^9j<%MsPNFD4nikSzlk3XD80j=@jc8RoYot zrt~9NzrU{koX%C5AQG97ag{x=Ds8QQRR8kbfBN@qf0xu>i~oei2%10YLP*dMq*zgGe~dnxTe+yg;A;pMN#9eis} i+>HPj2R?8fRAQ7pz}?@$_o&AXJG;zS+FkYhkNpEi=KzlY diff --git a/file.txt b/file.txt new file mode 100644 index 00000000..e69de29b diff --git a/images/etl-round.png b/images/etl-round.png new file mode 100644 index 0000000000000000000000000000000000000000..f59aba46b31d3020967d06aa2fc3a98865b0a9b1 GIT binary patch literal 33955 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®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 AH~;_u diff --git a/images/etl64.png b/images/etl64.png new file mode 100644 index 0000000000000000000000000000000000000000..9a16bbcef7c2a27be1ca390e727a06158c923d06 GIT binary patch literal 2047 zcmVh*ZH%@lnkcO(Aw)IsJZEcw_6vTY_RO0GXA2tP;^3&o_4kqdw- zNRkw^o+k{Wr`=TJVyOORp4sXn*@MjvJ?Pm`t<40*474IrK<~I-aN0Msu^`_bO4ZwWt%CH z4&da;lfWz$6+J&*c}1AvCoj{|^U2>`|Em8cpN(=@06>AeSaJ`4dH`tJ zyi4PgsQ}c|Tdmfh{?uwceBQ|gK}3-2vVWl zsuY+pV+OS9O>QhIUAT5wxNxCQ0QCY0-wIkmKmbZgNFw=h4vp`j?r|WDpkC2w2>}79si_GI00OT!@_a5xg>ExbVAG~eaR1)D zkOptJ+aV((gWI9i2q0WA3xI1F+P)nIX)!ZAtgAbyp`jrd8yjN=H9kJ>IzEhcJoWVS zKu%7Mm*esA@sOOH3=0-4@ccFn^}7JVUQNph3_x@=ye8)s%$fxd7Y7g<>!nfDMij5l zpq`zM$D$oead_UCn3xASk3%4R78e)8$jFGRRouFD3yO-0JT@t)I~)L`sH9+9z@r98 z?^9i*#l)%b?%lh6&f|1Cz0%{Lz_)9G0*H|T{4BV@_Zp|o1kj{2tE{c9^|HGt@Ucp^ zi}42l?av3&+nNc0(uP%7BSf#j*CS+S6u>I{d>f7La!z;~^(te$H4^~UVHLWDcG2`Y z>K~53|5AT|F|9TNARa$U&{*$ev;xb~^swOqp!T6a@_wkI)d`I0St9_J;AbfZ0PWOd zL?D1n0f1to0A9k+jc9zIb27apXt+`!L1HY;RibpJv|i;;Cm6^QRBs+&WeafG3Vc20 zPbcVlI4Tc=mjx&OMsp{ss;Zby*Voru2B1>lW1Va_JCKPGJ>3;8L335kq@|_#OowR} zw;iX`{sQRi>|_FHZf^G2&;wN`$G-v8Oex5jnfs>0yfm z&8$ng5Uw4R3ocu>%;&C_mX>5YOt_}KtU|xjaR=Igp78ixTwEPJb}TpmYSjuL zoEJ3dLx&DQI7)VQwmASEL-lh2P%eI=8JpFjrW=mZ(9jS(0A))mRUT9IAkcI)kug6Y zb$54%1pqCoOlbkiT|F#Fg&v(0ICbh&SO8G!nF2tqDglHab?Q}DSGzj7P!!sQQtvLC z{%r8N0K%uLmZN^cL_=U+ULNG<=j$pnGZXsz``MB8^Z@MK325liHB=TVPp+Svn+r)v zNnZY%20-Z#-jv+SOg#W}>@7_lGbTbf6VmN>c(UZ-=srO!=nEil(Nx&=0M_8hV;KOo zeh@&Ywh(}5?hz6Iq~8P(J~Mci)alYG0MO+pP)q+Jvq9o-NzvTl9RvM=a_oJo!vWw~ ze@GGV7a8TQ`m-|Q$+H600boY}xteQ-Jp~jQU7Pdd*@Msla7Eq^@b}M>Apzj(yaW)w zV5EZb{kYmzZ$pH!Eglg7jPB3T-a-na{<|ozeMs$}uH~XEZXynVIwxt{+`)nH9i#3A zt=;kCOaRKR7gQb+iNG3f$pvz@Ex3-$fH|W>}-KrDuLiP4I){*DEt-yfhUn zzXUZObrAJ6YM1=mzCB^wy~R&34;6O>9L!evl>z*dW9UnY{Vb!lj!w% dJHRZ literal 0 HcmV?d00001 diff --git a/etl32.png b/images/favicon-32.png similarity index 100% rename from etl32.png rename to images/favicon-32.png diff --git a/images/favicon-64.png b/images/favicon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..9a16bbcef7c2a27be1ca390e727a06158c923d06 GIT binary patch literal 2047 zcmVh*ZH%@lnkcO(Aw)IsJZEcw_6vTY_RO0GXA2tP;^3&o_4kqdw- zNRkw^o+k{Wr`=TJVyOORp4sXn*@MjvJ?Pm`t<40*474IrK<~I-aN0Msu^`_bO4ZwWt%CH z4&da;lfWz$6+J&*c}1AvCoj{|^U2>`|Em8cpN(=@06>AeSaJ`4dH`tJ zyi4PgsQ}c|Tdmfh{?uwceBQ|gK}3-2vVWl zsuY+pV+OS9O>QhIUAT5wxNxCQ0QCY0-wIkmKmbZgNFw=h4vp`j?r|WDpkC2w2>}79si_GI00OT!@_a5xg>ExbVAG~eaR1)D zkOptJ+aV((gWI9i2q0WA3xI1F+P)nIX)!ZAtgAbyp`jrd8yjN=H9kJ>IzEhcJoWVS zKu%7Mm*esA@sOOH3=0-4@ccFn^}7JVUQNph3_x@=ye8)s%$fxd7Y7g<>!nfDMij5l zpq`zM$D$oead_UCn3xASk3%4R78e)8$jFGRRouFD3yO-0JT@t)I~)L`sH9+9z@r98 z?^9i*#l)%b?%lh6&f|1Cz0%{Lz_)9G0*H|T{4BV@_Zp|o1kj{2tE{c9^|HGt@Ucp^ zi}42l?av3&+nNc0(uP%7BSf#j*CS+S6u>I{d>f7La!z;~^(te$H4^~UVHLWDcG2`Y z>K~53|5AT|F|9TNARa$U&{*$ev;xb~^swOqp!T6a@_wkI)d`I0St9_J;AbfZ0PWOd zL?D1n0f1to0A9k+jc9zIb27apXt+`!L1HY;RibpJv|i;;Cm6^QRBs+&WeafG3Vc20 zPbcVlI4Tc=mjx&OMsp{ss;Zby*Voru2B1>lW1Va_JCKPGJ>3;8L335kq@|_#OowR} zw;iX`{sQRi>|_FHZf^G2&;wN`$G-v8Oex5jnfs>0yfm z&8$ng5Uw4R3ocu>%;&C_mX>5YOt_}KtU|xjaR=Igp78ixTwEPJb}TpmYSjuL zoEJ3dLx&DQI7)VQwmASEL-lh2P%eI=8JpFjrW=mZ(9jS(0A))mRUT9IAkcI)kug6Y zb$54%1pqCoOlbkiT|F#Fg&v(0ICbh&SO8G!nF2tqDglHab?Q}DSGzj7P!!sQQtvLC z{%r8N0K%uLmZN^cL_=U+ULNG<=j$pnGZXsz``MB8^Z@MK325liHB=TVPp+Svn+r)v zNnZY%20-Z#-jv+SOg#W}>@7_lGbTbf6VmN>c(UZ-=srO!=nEil(Nx&=0M_8hV;KOo zeh@&Ywh(}5?hz6Iq~8P(J~Mci)alYG0MO+pP)q+Jvq9o-NzvTl9RvM=a_oJo!vWw~ ze@GGV7a8TQ`m-|Q$+H600boY}xteQ-Jp~jQU7Pdd*@Msla7Eq^@b}M>Apzj(yaW)w zV5EZb{kYmzZ$pH!Eglg7jPB3T-a-na{<|ozeMs$}uH~XEZXynVIwxt{+`)nH9i#3A zt=;kCOaRKR7gQb+iNG3f$pvz@Ex3-$fH|W>}-KrDuLiP4I){*DEt-yfhUn zzXUZObrAJ6YM1=mzCB^wy~R&34;6O>9L!evl>z*dW9UnY{Vb!lj!w% dJHRZ literal 0 HcmV?d00001 diff --git a/include/etl/absolute.h b/include/etl/absolute.h index 165dba9c..d473b3ec 100644 --- a/include/etl/absolute.h +++ b/include/etl/absolute.h @@ -39,7 +39,7 @@ namespace etl // For signed types. //*************************************************************************** template - typename etl::enable_if::value, T>::type + ETL_CONSTEXPR typename etl::enable_if::value, T>::type absolute(T value) { return (value < T(0)) ? -value : value; @@ -49,7 +49,7 @@ namespace etl // For unsigned types. //*************************************************************************** template - typename etl::enable_if::value, T>::type + ETL_CONSTEXPR typename etl::enable_if::value, T>::type absolute(T value) { return value; diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index 534ef9dc..f15ebd7f 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -46,13 +46,15 @@ SOFTWARE. #include "functional.h" #include "utility.h" -#if !defined(ETL_NO_STL) +#if ETL_USING_STL #include #include #include #include #endif +#include "private/minmax_push.h" + namespace etl { // Declare prototypes of the ETL's sort functions @@ -74,7 +76,7 @@ namespace etl //***************************************************************************** namespace etl { -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // iter_swap template @@ -93,7 +95,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // swap_ranges template @@ -120,14 +122,14 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // copy // Pointer template typename etl::enable_if::value && etl::is_pointer::value && - etl::is_pod::value_type>::value, TIterator2>::type + etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy(TIterator1 sb, TIterator1 se, TIterator2 db) { typedef typename etl::iterator_traits::value_type value_t; @@ -142,7 +144,7 @@ namespace etl template typename etl::enable_if::value || !etl::is_pointer::value || - !etl::is_pod::value_type>::value, TIterator2>::type + !etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy(TIterator1 sb, TIterator1 se, TIterator2 db) { while (sb != se) @@ -162,7 +164,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // reverse_copy template @@ -185,14 +187,14 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** // copy_n // Pointer template typename etl::enable_if::value && - etl::is_pointer::value && - etl::is_pod::value_type>::value, TIterator2>::type + etl::is_pointer::value && + etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy_n(TIterator1 sb, TSize count, TIterator2 db) { typedef typename etl::iterator_traits::value_type value_t; @@ -203,8 +205,8 @@ namespace etl // Other iterator template typename etl::enable_if::value || - !etl::is_pointer::value || - !etl::is_pod::value_type>::value, TIterator2>::type + !etl::is_pointer::value || + !etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy_n(TIterator1 sb, TSize count, TIterator2 db) { while (count != 0) @@ -230,14 +232,14 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // copy_backward // Pointer template typename etl::enable_if::value && - etl::is_pointer::value && - etl::is_pod::value_type>::value, TIterator2>::type + etl::is_pointer::value && + etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy_backward(TIterator1 sb, TIterator1 se, TIterator2 de) { typedef typename etl::iterator_traits::value_type value_t; @@ -250,8 +252,8 @@ namespace etl // Other iterator template typename etl::enable_if::value || - !etl::is_pointer::value || - !etl::is_pod::value_type>::value, TIterator2>::type + !etl::is_pointer::value || + !etl::is_trivially_copyable::value_type>::value, TIterator2>::type copy_backward(TIterator1 sb, TIterator1 se, TIterator2 de) { while (se != sb) @@ -272,11 +274,15 @@ namespace etl #endif #if ETL_CPP11_SUPPORTED -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // move + // non-pointer or not trivially copyable template - TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db) + typename etl::enable_if::value || + !etl::is_pointer::value || + !etl::is_trivially_copyable::value_type>::value, TIterator2>::type + move(TIterator1 sb, TIterator1 se, TIterator2 db) { while (sb != se) { @@ -285,6 +291,21 @@ namespace etl return db; } + + // pointer and trivially copyable + template + typename etl::enable_if::value && + etl::is_pointer::value && + etl::is_trivially_copyable::value_type>::value, TIterator2>::type + move(TIterator1 sb, TIterator1 se, TIterator2 db) + { + typedef typename etl::iterator_traits::value_type value_t; + typedef typename etl::iterator_traits::difference_type difference_t; + + difference_t count = (se - sb); + + return TIterator2(memmove(db, sb, sizeof(value_t) * count)) + count; + } #else //*************************************************************************** // move @@ -307,11 +328,15 @@ namespace etl #endif #if ETL_CPP11_SUPPORTED -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // move_backward + // non-pointer, non-pod template - TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de) + typename etl::enable_if::value || + !etl::is_pointer::value || + !etl::is_trivially_copyable::value_type>::value, TIterator2>::type + move_backward(TIterator1 sb, TIterator1 se, TIterator2 de) { while (sb != se) { @@ -320,6 +345,22 @@ namespace etl return de; } + + // pointer and pod + template + typename etl::enable_if::value && + etl::is_pointer::value && + etl::is_trivially_copyable::value_type>::value, TIterator2>::type + move_backward(TIterator1 sb, TIterator1 se, TIterator2 de) + { + typedef typename etl::iterator_traits::value_type value_t; + typedef typename etl::iterator_traits::difference_type difference_t; + + difference_t count = (se - sb); + TIterator2 db = de - count; + + return TIterator2(memmove(db, sb, sizeof(value_t) * count)) + count; + } #else //*************************************************************************** // move_backward @@ -340,7 +381,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // reverse // Pointers @@ -378,7 +419,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // lower_bound template @@ -436,7 +477,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // upper_bound template @@ -494,7 +535,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // equal_range template @@ -532,7 +573,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // find_if template @@ -562,7 +603,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // find template @@ -592,7 +633,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // fill template @@ -621,7 +662,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // fill_n template @@ -658,7 +699,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // count template @@ -690,7 +731,7 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // count_if template @@ -722,12 +763,12 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // equal template ETL_NODISCARD - typename etl::enable_if::value || !etl::is_pointer::value || !etl::is_pod::value_type>::value, bool>::type + typename etl::enable_if::value || !etl::is_pointer::value || !etl::is_trivially_copyable::value_type>::value, bool>::type equal(TIterator1 first1, TIterator1 last1, TIterator2 first2) { while (first1 != last1) @@ -743,13 +784,22 @@ namespace etl template ETL_NODISCARD - typename etl::enable_if::value && etl::is_pointer::value && etl::is_pod::value_type>::value, bool>::type + typename etl::enable_if::value && etl::is_pointer::value && etl::is_trivially_copyable::value_type>::value, bool>::type equal(TIterator1 first1, TIterator1 last1, TIterator2 first2) { typedef typename etl::iterator_traits::value_type value_t; return (memcmp(first1, first2, sizeof(value_t) * (last1 - first1)) == 0); } + + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return (etl::distance(first1, last1) == etl::distance(first2, last2)) && + etl::equal(first1, last1, first2); + } + #else //*************************************************************************** // equal @@ -759,9 +809,26 @@ namespace etl { return std::equal(first1, last1, first2); } + +#if ETL_CPP14_SUPPORTED + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return std::equal(first1, last1, first2, last2); + } +#else + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return (etl::distance(first1, last1) == etl::distance(first2, last2)) && + etl::equal(first1, last1, first2); + } +#endif #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // lexicographical_compare template @@ -823,7 +890,7 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // min template @@ -859,7 +926,7 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // max template @@ -895,7 +962,30 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL + //*************************************************************************** + // for_each + template + ETL_CONSTEXPR14 TUnaryOperation for_each(TIterator first, TIterator last, TUnaryOperation unary_operation) + { + while (first != last) + { + unary_operation(*first++); + } + + return unary_operation; + } +#else + //*************************************************************************** + // for_each + template + ETL_CONSTEXPR14 TUnaryOperation for_each(TIterator first, TIterator last, TUnaryOperation unary_operation) + { + return std::for_each(first, last, unary_operation); + } +#endif + +#if ETL_NOT_USING_STL //*************************************************************************** // transform template @@ -935,6 +1025,56 @@ namespace etl } #endif +#if ETL_NOT_USING_STL + //*************************************************************************** + // replace + template + ETL_CONSTEXPR14 void replace(TIterator first, TIterator last, const T& old_value, const T& new_value) + { + while (first != last) + { + if (*first == old_value) + { + *first = new_value; + } + + ++first; + } + } + + //*************************************************************************** + // replace_if + template + ETL_CONSTEXPR14 void replace_if(TIterator first, TIterator last, TPredicate predicate, const T& new_value) + { + while (first != last) + { + if (predicate(*first)) + { + *first = new_value; + } + + ++first; + } + } +#else + //*************************************************************************** + // replace + template + ETL_CONSTEXPR14 void replace(TIterator first, TIterator last, const T& old_value, const T& new_value) + { + std::replace(first, last, old_value, new_value); + } + + //*************************************************************************** + // replace_if + template + ETL_CONSTEXPR14 void replace_if(TIterator first, TIterator last, TPredicate predicate, const T& new_value) + { + std::replace_if(first, last, predicate, new_value); + } +#endif + //*************************************************************************** // Heap namespace private_heap @@ -1006,7 +1146,7 @@ namespace etl } } - #if defined (ETL_NO_STL) + #if ETL_NOT_USING_STL // Pop Heap template void pop_heap(TIterator first, TIterator last, TCompare compare) @@ -1186,7 +1326,7 @@ namespace etl { #if ETL_CPP11_SUPPORTED return std::is_heap(first, last); -#else +#else typedef etl::less::value_type> compare; return private_heap::is_heap(first, last - first, compare()); #endif @@ -1208,7 +1348,7 @@ namespace etl #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // Search template @@ -1273,33 +1413,91 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // Rotate + namespace private_algorithm + { + //********************************* + template + TIterator rotate_general(TIterator first, TIterator middle, TIterator last) + { + TIterator next = middle; + + while (first != next) + { + using ETL_OR_STD::swap; // Allow ADL + + swap(*first++, *next++); + + if (next == last) + { + next = middle; + } + else if (first == middle) + { + middle = next; + } + } + + return first; + } + + //********************************* + template + TIterator rotate_left_by_one(TIterator first, TIterator last) + { + typedef typename etl::iterator_traits::value_type value_type; + + // Save the first item. + value_type temp(etl::move(*first)); + + // Move the rest. + TIterator result = etl::move(etl::next(first), last, first); + + // Restore the first item in its rotated position. + *result = etl::move(temp); + + // The new position of the first item. + return result; + } + + //********************************* + template + TIterator rotate_right_by_one(TIterator first, TIterator last) + { + typedef typename etl::iterator_traits::value_type value_type; + + // Save the last item. + TIterator previous = etl::prev(last); + value_type temp(etl::move(*previous)); + + // Move the rest. + TIterator result = etl::move_backward(first, previous, last); + + // Restore the last item in its rotated position. + *first = etl::move(temp); + + // The new position of the first item. + return result; + } + } + + //********************************* template TIterator rotate(TIterator first, TIterator middle, TIterator last) { - using ETL_OR_STD::swap; // Allow ADL - - TIterator next = middle; - - while (first != next) + if (etl::next(first) == middle) { - using ETL_OR_STD::swap; - - swap(*first++, *next++); - - if (next == last) - { - next = middle; - } - else if (first == middle) - { - middle = next; - } + return private_algorithm::rotate_left_by_one(first, last); } - return first; + if (etl::next(middle) == last) + { + return private_algorithm::rotate_right_by_one(first, last); + } + + return private_algorithm::rotate_general(first, middle, last); } #else //*************************************************************************** @@ -1311,7 +1509,7 @@ namespace etl } #endif -#if defined (ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** // find_end // Predicate @@ -1379,7 +1577,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** /// Finds the iterator to the smallest element in the range (begin, end).
/// @@ -1449,7 +1647,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** /// Finds the iterator to the largest element in the range (begin, end).
/// @@ -1519,7 +1717,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// Finds the greatest and the smallest element in the range (begin, end).
/// @@ -1595,7 +1793,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// minmax ///\ingroup algorithm @@ -1651,7 +1849,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// is_sorted_until ///\ingroup algorithm @@ -1737,7 +1935,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// is_sorted ///\ingroup algorithm @@ -1793,7 +1991,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// find_if_not ///\ingroup algorithm @@ -1833,7 +2031,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// is_permutation ///\ingroup algorithm @@ -2029,7 +2227,7 @@ namespace etl #endif #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// is_partitioned ///\ingroup algorithm @@ -2075,7 +2273,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// partition_point /// @@ -2115,7 +2313,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// Copies the elements from the range (begin, end) to two different ranges /// depending on the value returned by the predicate.
@@ -2161,7 +2359,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// copy_if ///\ingroup algorithm @@ -2201,7 +2399,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// all_of ///\ingroup algorithm @@ -2231,7 +2429,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// any_of ///\ingroup algorithm @@ -2261,7 +2459,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) || !ETL_CPP11_SUPPORTED +#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED //*************************************************************************** /// none_of ///\ingroup algorithm @@ -2291,7 +2489,7 @@ namespace etl } #endif -#if defined(ETL_NO_STL) +#if ETL_NOT_USING_STL //*************************************************************************** /// Sorts the elements. /// Uses user defined comparison. @@ -3244,4 +3442,6 @@ namespace etl #endif } +#include "private/minmax_pop.h" + #endif diff --git a/include/etl/alignment.h b/include/etl/alignment.h index 5ebabba5..8b299f39 100644 --- a/include/etl/alignment.h +++ b/include/etl/alignment.h @@ -99,7 +99,7 @@ namespace etl { public: -#if defined(ETL_NO_64BIT_TYPES) +#if ETL_NOT_USING_64BIT_TYPES typedef typename private_alignment::type_with_alignment_helper::type type; #else typedef typename private_alignment::type_with_alignment_helper::type type; @@ -184,7 +184,7 @@ namespace etl return reinterpret_cast(data); } -#if ETL_CPP11_SUPPORTED +#if ETL_CPP11_SUPPORTED && !defined(ETL_COMPILER_ARM5) alignas(ALIGNMENT) char data[LENGTH]; #else union @@ -196,14 +196,24 @@ namespace etl }; }; +#if ETL_CPP11_SUPPORTED + template + using aligned_storage_t = typename aligned_storage::type; +#endif + //*************************************************************************** /// Aligned storage as ///\ingroup alignment //*************************************************************************** - template + template struct aligned_storage_as : public etl::aligned_storage::value> { }; + +#if ETL_CPP11_SUPPORTED + template + using aligned_storage_as_t = typename aligned_storage_as::type; +#endif } #endif diff --git a/include/etl/array.h b/include/etl/array.h index 6bc922ef..e48f83b1 100644 --- a/include/etl/array.h +++ b/include/etl/array.h @@ -5,7 +5,7 @@ The MIT License(MIT) Embedded Template Library. https://github.com/ETLCPP/etl -http://www.etlcpp.com +https://www.etlcpp.com Copyright(c) 2014 jwellbelove @@ -139,7 +139,7 @@ namespace etl /// Returns a reference to the value at index 'i'. ///\param i The index of the element to access. //************************************************************************* - reference operator[](size_t i) + ETL_CONSTEXPR reference operator[](size_t i) { return _buffer[i]; } @@ -149,7 +149,7 @@ namespace etl /// Returns a const reference to the value at index 'i'. ///\param i The index of the element to access. //************************************************************************* - const_reference operator[](size_t i) const + ETL_CONSTEXPR const_reference operator[](size_t i) const { return _buffer[i]; } @@ -157,7 +157,7 @@ namespace etl //************************************************************************* /// Returns a reference to the first element. //************************************************************************* - reference front() + ETL_CONSTEXPR reference front() { return _buffer[0]; } @@ -165,7 +165,7 @@ namespace etl //************************************************************************* /// Returns a const reference to the first element. //************************************************************************* - const_reference front() const + ETL_CONSTEXPR const_reference front() const { return _buffer[0]; } @@ -173,7 +173,7 @@ namespace etl //************************************************************************* /// Returns a reference to the last element. //************************************************************************* - reference back() + ETL_CONSTEXPR reference back() { return _buffer[SIZE - 1]; } @@ -181,7 +181,7 @@ namespace etl //************************************************************************* /// Returns a const reference to the last element. //************************************************************************* - const_reference back() const + ETL_CONSTEXPR const_reference back() const { return _buffer[SIZE - 1]; } @@ -189,7 +189,7 @@ namespace etl //************************************************************************* /// Returns a pointer to the first element of the internal buffer. //************************************************************************* - pointer data() + ETL_CONSTEXPR pointer data() ETL_NOEXCEPT { return &_buffer[0]; } @@ -197,7 +197,7 @@ namespace etl //************************************************************************* /// Returns a const pointer to the first element of the internal buffer. //************************************************************************* - const_pointer data() const + ETL_CONSTEXPR const_pointer data() const ETL_NOEXCEPT { return &_buffer[0]; } @@ -209,7 +209,7 @@ namespace etl //************************************************************************* /// Returns an iterator to the beginning of the array. //************************************************************************* - iterator begin() + ETL_CONSTEXPR iterator begin() ETL_NOEXCEPT { return &_buffer[0]; } @@ -217,7 +217,7 @@ namespace etl //************************************************************************* /// Returns a const iterator to the beginning of the array. //************************************************************************* - const_iterator begin() const + ETL_CONSTEXPR const_iterator begin() const ETL_NOEXCEPT { return &_buffer[0]; } @@ -225,7 +225,7 @@ namespace etl //************************************************************************* /// Returns a const iterator to the beginning of the array. //************************************************************************* - const_iterator cbegin() const + ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT { return begin(); } @@ -233,7 +233,7 @@ namespace etl //************************************************************************* /// Returns an iterator to the end of the array. //************************************************************************* - iterator end() + ETL_CONSTEXPR iterator end() ETL_NOEXCEPT { return &_buffer[SIZE]; } @@ -241,7 +241,7 @@ namespace etl //************************************************************************* /// Returns a const iterator to the end of the array. //************************************************************************* - const_iterator end() const + ETL_CONSTEXPR const_iterator end() const ETL_NOEXCEPT { return &_buffer[SIZE]; } @@ -249,7 +249,7 @@ namespace etl //************************************************************************* // Returns a const iterator to the end of the array. //************************************************************************* - const_iterator cend() const + ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT { return &_buffer[SIZE]; } @@ -257,7 +257,7 @@ namespace etl //************************************************************************* // Returns an reverse iterator to the reverse beginning of the array. //************************************************************************* - reverse_iterator rbegin() + ETL_CONSTEXPR reverse_iterator rbegin() ETL_NOEXCEPT { return reverse_iterator(end()); } @@ -265,7 +265,7 @@ namespace etl //************************************************************************* /// Returns a const reverse iterator to the reverse beginning of the array. //************************************************************************* - const_reverse_iterator rbegin() const + ETL_CONSTEXPR const_reverse_iterator rbegin() const ETL_NOEXCEPT { return const_reverse_iterator(end()); } @@ -273,7 +273,7 @@ namespace etl //************************************************************************* /// Returns a const reverse iterator to the reverse beginning of the array. //************************************************************************* - const_reverse_iterator crbegin() const + ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT { return const_reverse_iterator(end()); } @@ -281,7 +281,7 @@ namespace etl //************************************************************************* /// Returns a reverse iterator to the end of the array. //************************************************************************* - reverse_iterator rend() + ETL_CONSTEXPR reverse_iterator rend() ETL_NOEXCEPT { return reverse_iterator(begin()); } @@ -289,7 +289,7 @@ namespace etl //************************************************************************* /// Returns a const reverse iterator to the end of the array. //************************************************************************* - const_reverse_iterator rend() const + ETL_CONSTEXPR const_reverse_iterator rend() const ETL_NOEXCEPT { return const_reverse_iterator(begin()); } @@ -297,7 +297,7 @@ namespace etl //************************************************************************* /// Returns a const reverse iterator to the end of the array. //************************************************************************* - const_reverse_iterator crend() const + ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT { return const_reverse_iterator(begin()); } @@ -309,7 +309,7 @@ namespace etl //************************************************************************* /// Returns true if the array size is zero. //************************************************************************* - bool empty() const + ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT { return (SIZE == 0); } @@ -317,7 +317,7 @@ namespace etl //************************************************************************* /// Returns the size of the array. //************************************************************************* - size_t size() const + ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT { return SIZE; } @@ -325,7 +325,7 @@ namespace etl //************************************************************************* /// Returns the maximum possible size of the array. //************************************************************************* - size_t max_size() const + ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT { return SIZE; } @@ -347,7 +347,7 @@ namespace etl /// Swaps the contents of this array and another. ///\param other A reference to the other array. //************************************************************************* - void swap(array& other) + void swap(array& other) ETL_NOEXCEPT { using ETL_OR_STD::swap; // Allow ADL @@ -552,6 +552,15 @@ namespace etl T _buffer[SIZE]; }; + //************************************************************************* + /// Template deduction guides. + //************************************************************************* +#if ETL_CPP17_SUPPORTED + template + array(T, Ts...) + -> array && ...), T>, 1U + sizeof...(Ts)>; +#endif + //************************************************************************* /// Overloaded swap for etl::array ///\param lhs The first array. @@ -670,4 +679,3 @@ namespace etl } #endif - diff --git a/include/etl/array_view.h b/include/etl/array_view.h index a682b665..c74331ee 100644 --- a/include/etl/array_view.h +++ b/include/etl/array_view.h @@ -39,16 +39,13 @@ SOFTWARE. #include "nullptr.h" #include "hash.h" #include "algorithm.h" - -#include "algorithm.h" +#include "memory.h" +#include "type_traits.h" ///\defgroup array array /// A wrapper for arrays ///\ingroup containers -#undef ETL_FILE -#define ETL_FILE "41" - namespace etl { //*************************************************************************** @@ -73,7 +70,7 @@ namespace etl public: array_view_bounds(string_type file_name_, numeric_type line_number_) - : array_view_exception(ETL_ERROR_TEXT("array_view:bounds", ETL_FILE"A"), file_name_, line_number_) + : array_view_exception(ETL_ERROR_TEXT("array_view:bounds", ETL_ARRAY_VIEW_FILE_ID"A"), file_name_, line_number_) { } }; @@ -87,7 +84,7 @@ namespace etl public: array_view_uninitialised(string_type file_name_, numeric_type line_number_) - : array_view_exception(ETL_ERROR_TEXT("array_view:uninitialised", ETL_FILE"B"), file_name_, line_number_) + : array_view_exception(ETL_ERROR_TEXT("array_view:uninitialised", ETL_ARRAY_VIEW_FILE_ID"B"), file_name_, line_number_) { } }; @@ -100,23 +97,31 @@ namespace etl { public: - typedef T value_type; - typedef size_t size_type; - typedef T& reference; - typedef const T& const_reference; - typedef T* pointer; - typedef const T* const_pointer; - typedef T* iterator; - typedef const T* const_iterator; - typedef ETL_OR_STD::reverse_iterator reverse_iterator; + typedef T value_type; + typedef size_t size_type; + typedef const T& const_reference; + typedef const T* const_pointer; + typedef const T* const_iterator; typedef ETL_OR_STD::reverse_iterator const_reverse_iterator; +#if defined(ETL_ARRAY_VIEW_IS_MUTABLE) + typedef T* pointer; + typedef T& reference; + typedef T* iterator; + typedef ETL_OR_STD::reverse_iterator reverse_iterator; +#else + typedef const_pointer pointer; + typedef const_reference reference; + typedef const_pointer iterator; + typedef const_reverse_iterator reverse_iterator; +#endif + //************************************************************************* /// Default constructor. //************************************************************************* ETL_CONSTEXPR array_view() - : mbegin(nullptr), - mend(nullptr) + : mbegin(ETL_NULLPTR), + mend(ETL_NULLPTR) { } @@ -125,7 +130,7 @@ namespace etl /// data() and size() member functions. //************************************************************************* template - ETL_CONSTEXPR explicit array_view(TArray& a) + ETL_CONSTEXPR array_view(TArray& a) : mbegin(a.data()), mend(a.data() + a.size()) { @@ -155,8 +160,8 @@ namespace etl //************************************************************************* /// Construct from C array //************************************************************************* - template - ETL_CONSTEXPR explicit array_view(T(&begin_)[ARRAY_SIZE]) + template + ETL_CONSTEXPR array_view(T(&begin_)[ARRAY_SIZE]) : mbegin(begin_), mend(begin_ + ARRAY_SIZE) { @@ -370,6 +375,7 @@ namespace etl mend = etl::addressof(*begin_) + size_; } +#if defined(ETL_ARRAY_VIEW_IS_MUTABLE) //************************************************************************* /// Returns a reference to the indexed value. //************************************************************************* @@ -377,6 +383,7 @@ namespace etl { return mbegin[i]; } +#endif //************************************************************************* /// Returns a const reference to the indexed value. @@ -386,22 +393,24 @@ namespace etl return mbegin[i]; } +#if defined(ETL_ARRAY_VIEW_IS_MUTABLE) //************************************************************************* /// Returns a reference to the indexed value. //************************************************************************* reference at(const size_t i) { - ETL_ASSERT((mbegin != nullptr && mend != nullptr), ETL_ERROR(array_view_uninitialised)); + ETL_ASSERT((mbegin != ETL_NULLPTR && mend != ETL_NULLPTR), ETL_ERROR(array_view_uninitialised)); ETL_ASSERT(i < size(), ETL_ERROR(array_view_bounds)); return mbegin[i]; } +#endif //************************************************************************* /// Returns a const reference to the indexed value. //************************************************************************* const_reference at(const size_t i) const { - ETL_ASSERT((mbegin != nullptr && mend != nullptr), ETL_ERROR(array_view_uninitialised)); + ETL_ASSERT((mbegin != ETL_NULLPTR && mend != ETL_NULLPTR), ETL_ERROR(array_view_uninitialised)); ETL_ASSERT(i < size(), ETL_ERROR(array_view_bounds)); return mbegin[i]; } @@ -422,7 +431,10 @@ namespace etl //************************************************************************* void remove_prefix(const size_type n) { - mbegin += n; + if (n < size()) + mbegin += n; + else + mbegin = mend; } //************************************************************************* @@ -430,7 +442,10 @@ namespace etl //************************************************************************* void remove_suffix(const size_type n) { - mend -= n; + if (n < size()) + mend -= n; + else + mend = mbegin; } //************************************************************************* @@ -484,10 +499,28 @@ namespace etl private: - T* mbegin; - T* mend; + pointer mbegin; + pointer mend; }; + //************************************************************************* + /// Template deduction guides. + //************************************************************************* +#if ETL_CPP17_SUPPORTED + template + array_view(TArray& a) + -> array_view; + + template + array_view(const TIterator begin_, const TIterator end_) + -> array_view>; + + template + array_view(const TIterator begin_, const TSize size_) + -> array_view>; +#endif + //************************************************************************* /// Hash function. //************************************************************************* @@ -513,7 +546,4 @@ void swap(etl::array_view& lhs, etl::array_view& rhs) lhs.swap(rhs); } -#undef ETL_FILE - #endif - diff --git a/include/etl/array_wrapper.h b/include/etl/array_wrapper.h index cf72edb2..c486b764 100644 --- a/include/etl/array_wrapper.h +++ b/include/etl/array_wrapper.h @@ -45,9 +45,6 @@ SOFTWARE. /// A wrapper for arrays ///\ingroup containers -#undef ETL_FILE -#define ETL_FILE "42" - namespace etl { //*************************************************************************** @@ -72,7 +69,7 @@ namespace etl public: array_wrapper_bounds(string_type file_name_, numeric_type line_number_) - : array_wrapper_exception(ETL_ERROR_TEXT("array_wrapper:bounds", ETL_FILE"A"), file_name_, line_number_) + : array_wrapper_exception(ETL_ERROR_TEXT("array_wrapper:bounds", ETL_ARRAY_WRAPPER_FILE_ID"A"), file_name_, line_number_) { } }; @@ -417,7 +414,5 @@ void swap(etl::array_wrapper& lhs, #define ETL_ARRAY_WRAPPER(arraytype, arrayobject) etl::array_wrapper -#undef ETL_FILE - #endif diff --git a/include/etl/atomic.h b/include/etl/atomic.h index 41996c07..1af2a01b 100644 --- a/include/etl/atomic.h +++ b/include/etl/atomic.h @@ -31,7 +31,7 @@ SOFTWARE. #include "platform.h" -#if ETL_CPP11_SUPPORTED == 1 && !defined(ETL_NO_STL) +#if ETL_CPP11_SUPPORTED && (ETL_USING_STL || defined(ETL_IN_UNIT_TEST)) #include "atomic/atomic_std.h" #define ETL_HAS_ATOMIC 1 #elif defined(ETL_COMPILER_ARM5) @@ -43,8 +43,12 @@ SOFTWARE. #elif defined(ETL_COMPILER_GCC) #include "atomic/atomic_gcc_sync.h" #define ETL_HAS_ATOMIC 1 +#elif defined(ETL_COMPILER_CLANG) + #include "atomic/atomic_clang_sync.h" + #define ETL_HAS_ATOMIC 1 #else #define ETL_HAS_ATOMIC 0 + #pragma message ("ETL atomics not supported") #endif #endif diff --git a/include/etl/atomic/atomic_clang_sync.h b/include/etl/atomic/atomic_clang_sync.h new file mode 100644 index 00000000..d4a3c930 --- /dev/null +++ b/include/etl/atomic/atomic_clang_sync.h @@ -0,0 +1,34 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2017 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_ATOMIC_CLANG_INCLUDED +#define ETL_ATOMIC_CLANG_INCLUDED + +#include "atomic_gcc_sync.h" + +#endif \ No newline at end of file diff --git a/include/etl/atomic/atomic_gcc_sync.h b/include/etl/atomic/atomic_gcc_sync.h index da86e89e..be188655 100644 --- a/include/etl/atomic/atomic_gcc_sync.h +++ b/include/etl/atomic/atomic_gcc_sync.h @@ -61,6 +61,9 @@ namespace etl memory_order_seq_cst } memory_order; + //*************************************************************************** + /// For all types except bool and pointers + //*************************************************************************** template class atomic { @@ -430,24 +433,27 @@ namespace etl private: - atomic& operator =(const atomic&); - atomic& operator =(const atomic&) volatile; + atomic& operator =(const atomic&) ETL_DELETE; + atomic& operator =(const atomic&) volatile ETL_DELETE; mutable volatile T value; }; + //*************************************************************************** + /// Specialisation for pointers + //*************************************************************************** template class atomic { public: atomic() - : value(nullptr) + : value(0U) { } atomic(T* v) - : value(v) + : value(uintptr_t(v)) { } @@ -540,7 +546,7 @@ namespace etl operator T*() volatile const { - return __sync_fetch_and_add(&value, 0); + return (T*)__sync_fetch_and_add(&value, 0); } // Is lock free? @@ -557,12 +563,12 @@ namespace etl // Store void store(T* v, etl::memory_order order = etl::memory_order_seq_cst) { - __sync_lock_test_and_set(&value, v); + __sync_lock_test_and_set(&value, uintptr_t(v)); } void store(T* v, etl::memory_order order = etl::memory_order_seq_cst) volatile { - __sync_lock_test_and_set(&value, v); + __sync_lock_test_and_set(&value, uintptr_t(v)); } // Load @@ -573,7 +579,7 @@ namespace etl T* load(etl::memory_order order = etl::memory_order_seq_cst) const volatile { - return __sync_fetch_and_add(&value, 0); + return (T*)__sync_fetch_and_add(&value, 0); } // Fetch add @@ -601,18 +607,18 @@ namespace etl // Exchange T* exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst) { - return (T*)__sync_lock_test_and_set(&value, v); + return (T*)__sync_lock_test_and_set(&value, uintptr_t(v)); } T* exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst) volatile { - return (T*)__sync_lock_test_and_set(&value, v); + return (T*)__sync_lock_test_and_set(&value, uintptr_t(v)); } // Compare exchange weak bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) { - T* old = __sync_val_compare_and_swap(&value, expected, desired); + T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired)); if (old == expected) { @@ -627,7 +633,7 @@ namespace etl bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) volatile { - T* old = __sync_val_compare_and_swap(&value, expected, desired); + T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired)); if (old == expected) { @@ -642,7 +648,7 @@ namespace etl bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) { - T* old = __sync_val_compare_and_swap(&value, expected, desired); + T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired)); if (old == expected) { @@ -657,7 +663,7 @@ namespace etl bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) volatile { - T* old = __sync_val_compare_and_swap(&value, expected, desired); + T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired)); if (old == expected) { @@ -737,10 +743,10 @@ namespace etl private: - atomic& operator =(const atomic&); - atomic& operator =(const atomic&) volatile; + atomic& operator =(const atomic&) ETL_DELETE; + atomic& operator =(const atomic&) volatile ETL_DELETE; - mutable volatile T* value; + mutable uintptr_t value; }; typedef etl::atomic atomic_char; @@ -757,13 +763,15 @@ namespace etl typedef etl::atomic atomic_wchar_t; typedef etl::atomic atomic_char16_t; typedef etl::atomic atomic_char32_t; +#if ETL_USING_8BIT_TYPES typedef etl::atomic atomic_uint8_t; typedef etl::atomic atomic_int8_t; +#endif typedef etl::atomic atomic_uint16_t; typedef etl::atomic atomic_int16_t; typedef etl::atomic atomic_uint32_t; typedef etl::atomic atomic_int32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef etl::atomic atomic_uint64_t; typedef etl::atomic atomic_int64_t; #endif @@ -773,7 +781,7 @@ namespace etl typedef etl::atomic atomic_uint_least16_t; typedef etl::atomic atomic_int_least32_t; typedef etl::atomic atomic_uint_least32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef etl::atomic atomic_int_least64_t; typedef etl::atomic atomic_uint_least64_t; #endif @@ -783,7 +791,7 @@ namespace etl typedef etl::atomic atomic_uint_fast16_t; typedef etl::atomic atomic_int_fast32_t; typedef etl::atomic atomic_uint_fast32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef etl::atomic atomic_int_fast64_t; typedef etl::atomic atomic_uint_fast64_t; #endif diff --git a/include/etl/atomic/atomic_llvm_sync.h b/include/etl/atomic/atomic_llvm_sync.h deleted file mode 100644 index 50e0be01..00000000 --- a/include/etl/atomic/atomic_llvm_sync.h +++ /dev/null @@ -1,785 +0,0 @@ -/****************************************************************************** -The MIT License(MIT) - -Embedded Template Library. -https://github.com/ETLCPP/etl -https://www.etlcpp.com - -Copyright(c) 2017 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_ATOMIC_LLVM_SYNC_INCLUDED -#define ETL_ATOMIC_LLVM_SYNC_INCLUDED - -//#include "../platform.h" -//#include "../type_traits.h" -//#include "../static_assert.h" -//#include "../nullptr.h" -//#include "../char_traits.h" -// -//#include -// -//namespace etl -//{ -// //*************************************************************************** -// // Atomic type for pre C++11 GCC compilers that support the builtin '__sync' functions. -// // Only integral and pointer types are supported. -// //*************************************************************************** -// -// typedef enum memory_order -// { -// memory_order_relaxed, -// memory_order_consume, -// memory_order_acquire, -// memory_order_release, -// memory_order_acq_rel, -// memory_order_seq_cst -// } memory_order; -// -// template -// class atomic -// { -// public: -// -// ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); -// -// atomic() -// : value(0) -// { -// } -// -// atomic(T v) -// : value(v) -// { -// } -// -// // Assignment -// T operator =(T v) -// { -// store(v); -// -// return v; -// } -// -// T operator =(T v) volatile -// { -// store(v); -// -// return v; -// } -// -// // Pre-increment -// T operator ++() -// { -// return fetch_add(1) + 1; -// } -// -// T operator ++() volatile -// { -// return fetch_add(1) + 1; -// } -// -// // Post-increment -// T operator ++(int) -// { -// return fetch_add(1); -// } -// -// T operator ++(int) volatile -// { -// return fetch_add(1); -// } -// -// // Pre-decrement -// T operator --() -// { -// return fetch_sub(1) + 1; -// } -// -// T operator --() volatile -// { -// return fetch_sub(1) + 1; -// } -// -// // Post-decrement -// T operator --(int) -// { -// return fetch_sub(1); -// } -// -// T operator --(int) volatile -// { -// return fetch_sub(1); -// } -// -// // Add -// T operator +=(T v) -// { -// return fetch_add(v) + v; -// } -// -// T operator +=(T v) volatile -// { -// return fetch_add(v) + v; -// } -// -// // Subtract -// T operator -=(T v) -// { -// return fetch_sub(v) - v; -// } -// -// T operator -=(T v) volatile -// { -// return fetch_sub(v) - v; -// } -// -// // And -// T operator &=(T v) -// { -// return fetch_and(v) & v; -// } -// -// T operator &=(T v) volatile -// { -// return fetch_and(v) & v; -// } -// -// // Or -// T operator |=(T v) -// { -// return fetch_or(v) | v; -// } -// -// T operator |=(T v) volatile -// { -// return fetch_or(v) | v; -// } -// -// // Exclusive or -// T operator ^=(T v) -// { -// return fetch_xor(v) ^ v; -// } -// -// T operator ^=(T v) volatile -// { -// return fetch_xor(v) ^ v; -// } -// -// // Conversion operator -// operator T () const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// operator T() volatile const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// // Is lock free? -// bool is_lock_free() const -// { -// return true; -// } -// -// bool is_lock_free() const volatile -// { -// return true; -// } -// -// // Store -// void store(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// __sync_lock_test_and_set(&value, v); -// } -// -// void store(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// __sync_lock_test_and_set(&value, v); -// } -// -// // Load -// T load(etl::memory_order order = etl::memory_order_seq_cst) const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// T load(etl::memory_order order = etl::memory_order_seq_cst) const volatile -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// // Fetch add -// T fetch_add(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_add(&value, v); -// } -// -// T fetch_add(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_add(&value, v); -// } -// -// // Fetch subtract -// T fetch_sub(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_sub(&value, v); -// } -// -// T fetch_sub(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_sub(&value, v); -// } -// -// // Fetch or -// T fetch_or(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_or(&value, v); -// } -// -// T fetch_or(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_or(&value, v); -// } -// -// // Fetch and -// T fetch_and(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_and(&value, v); -// } -// -// T fetch_and(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_and(&value, v); -// } -// -// // Fetch exclusive or -// T fetch_xor(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_xor(&value, v); -// } -// -// T fetch_xor(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_xor(&value, v); -// } -// -// // Exchange -// T exchange(T v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_lock_test_and_set(&value, v); -// } -// -// T exchange(T v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_lock_test_and_set(&value, v); -// } -// -// // Compare exchange weak -// bool compare_exchange_weak(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst) -// { -// T old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// T old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T& expected, T desired, etl::memory_order success, etl::memory_order failure) -// { -// T old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T& expected, T desired, etl::memory_order success, etl::memory_order failure) volatile -// { -// T old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// // Compare exchange strong -// bool compare_exchange_strong(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst) -// { -// T old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// T old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T& expected, T desired, etl::memory_order success, etl::memory_order failure) -// { -// T old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T& expected, T desired, etl::memory_order success, etl::memory_order failure) volatile -// { -// T old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// private: -// -// atomic& operator =(const atomic&); -// atomic& operator =(const atomic&) volatile; -// -// mutable volatile T value; -// }; -// -// template -// class atomic -// { -// public: -// -// atomic() -// : value(nullptr) -// { -// } -// -// atomic(T* v) -// : value(v) -// { -// } -// -// // Assignment -// T* operator =(T* v) -// { -// store(v); -// -// return v; -// } -// -// T* operator =(T* v) volatile -// { -// store(v); -// -// return v; -// } -// -// // Pre-increment -// T* operator ++() -// { -// return fetch_add(1) + 1; -// } -// -// T* operator ++() volatile -// { -// return fetch_add(1) + 1; -// } -// -// // Post-increment -// T* operator ++(int) -// { -// return fetch_add(1); -// } -// -// T* operator ++(int) volatile -// { -// return fetch_add(1); -// } -// -// // Pre-decrement -// T* operator --() -// { -// return fetch_sub(1) + 1; -// } -// -// T* operator --() volatile -// { -// return fetch_sub(1) + 1; -// } -// -// // Post-decrement -// T* operator --(int) -// { -// return fetch_sub(1); -// } -// -// T* operator --(int) volatile -// { -// return fetch_sub(1); -// } -// -// // Add -// T* operator +=(ptrdiff_t v) -// { -// return fetch_add(v) + v; -// } -// -// T* operator +=(ptrdiff_t v) volatile -// { -// return fetch_add(v) + v; -// } -// -// // Subtract -// T* operator -=(ptrdiff_t v) -// { -// return fetch_sub(v) - v; -// } -// -// T* operator -=(ptrdiff_t v) volatile -// { -// return fetch_sub(v) - v; -// } -// -// // Conversion operator -// operator T* () const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// operator T*() volatile const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// // Is lock free? -// bool is_lock_free() const -// { -// return true; -// } -// -// bool is_lock_free() const volatile -// { -// return true; -// } -// -// // Store -// void store(T* v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// __sync_lock_test_and_set(&value, v); -// } -// -// void store(T* v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// __sync_lock_test_and_set(&value, v); -// } -// -// // Load -// T* load(etl::memory_order order = etl::memory_order_seq_cst) const -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// T* load(etl::memory_order order = etl::memory_order_seq_cst) const volatile -// { -// return __sync_fetch_and_add(&value, 0); -// } -// -// // Fetch add -// T* fetch_add(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_add(&value, v); -// } -// -// T* fetch_add(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_add(&value, v); -// } -// -// // Fetch subtract -// T* fetch_sub(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_fetch_and_sub(&value, v); -// } -// -// T* fetch_sub(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_fetch_and_sub(&value, v); -// } -// -// // Exchange -// T* exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst) -// { -// return __sync_lock_test_and_set(&value, v); -// } -// -// T* exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// return __sync_lock_test_and_set(&value, v); -// } -// -// // Compare exchange weak -// bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) -// { -// T* old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// T* old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) -// { -// T* old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) volatile -// { -// T* old = __sync_val_compare_and_swap(&value, expected, desired); -// -// if (old == expected) -// { -// return true; -// } -// else -// { -// expected = old; -// return false; -// } -// } -// -// // Compare exchange strong -// bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) -// { -// T* old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T*))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) volatile -// { -// T* old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T*))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) -// { -// T* old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T*))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) volatile -// { -// T* old = expected; -// -// while (!compare_exchange_weak(old, desired)) -// { -// if (memcmp(&old, &expected, sizeof(T*))) -// { -// expected = old; -// return false; -// } -// } -// -// return true; -// } -// -// private: -// -// atomic& operator =(const atomic&); -// atomic& operator =(const atomic&) volatile; -// -// mutable volatile T* value; -// }; -// -// typedef etl::atomic atomic_char; -// typedef etl::atomic atomic_schar; -// typedef etl::atomic atomic_uchar; -// typedef etl::atomic atomic_short; -// typedef etl::atomic atomic_ushort; -// typedef etl::atomic atomic_int; -// typedef etl::atomic atomic_uint; -// typedef etl::atomic atomic_long; -// typedef etl::atomic atomic_ulong; -// typedef etl::atomic atomic_llong; -// typedef etl::atomic atomic_ullong; -// typedef etl::atomic atomic_wchar_t; -// typedef etl::atomic atomic_char16_t; -// typedef etl::atomic atomic_char32_t; -// typedef etl::atomic atomic_uint8_t; -// typedef etl::atomic atomic_int8_t; -// typedef etl::atomic atomic_uint16_t; -// typedef etl::atomic atomic_int16_t; -// typedef etl::atomic atomic_uint32_t; -// typedef etl::atomic atomic_int32_t; -// typedef etl::atomic atomic_uint64_t; -// typedef etl::atomic atomic_int64_t; -// typedef etl::atomic atomic_int_least8_t; -// typedef etl::atomic atomic_uint_least8_t; -// typedef etl::atomic atomic_int_least16_t; -// typedef etl::atomic atomic_uint_least16_t; -// typedef etl::atomic atomic_int_least32_t; -// typedef etl::atomic atomic_uint_least32_t; -// typedef etl::atomic atomic_int_least64_t; -// typedef etl::atomic atomic_uint_least64_t; -// typedef etl::atomic atomic_int_fast8_t; -// typedef etl::atomic atomic_uint_fast8_t; -// typedef etl::atomic atomic_int_fast16_t; -// typedef etl::atomic atomic_uint_fast16_t; -// typedef etl::atomic atomic_int_fast32_t; -// typedef etl::atomic atomic_uint_fast32_t; -// typedef etl::atomic atomic_int_fast64_t; -// typedef etl::atomic atomic_uint_fast64_t; -// typedef etl::atomic atomic_intptr_t; -// typedef etl::atomic atomic_uintptr_t; -// typedef etl::atomic atomic_size_t; -// typedef etl::atomic atomic_ptrdiff_t; -// typedef etl::atomic atomic_intmax_t; -// typedef etl::atomic atomic_uintmax_t; -//} - -#endif diff --git a/include/etl/atomic/atomic_std.h b/include/etl/atomic/atomic_std.h index 9c160f71..7dce3647 100644 --- a/include/etl/atomic/atomic_std.h +++ b/include/etl/atomic/atomic_std.h @@ -343,7 +343,7 @@ namespace etl public: atomic() - : value(nullptr) + : value(ETL_NULLPTR) { } @@ -550,12 +550,13 @@ namespace etl private: - atomic & operator =(const atomic&); - //atomic& operator =(const atomic&) volatile; + atomic & operator =(const atomic&) ETL_DELETE; + atomic& operator =(const atomic&) volatile ETL_DELETE; std::atomic value; }; + typedef std::atomic atomic_bool; typedef std::atomic atomic_char; typedef std::atomic atomic_schar; typedef std::atomic atomic_uchar; @@ -570,13 +571,15 @@ namespace etl typedef std::atomic atomic_wchar_t; typedef std::atomic atomic_char16_t; typedef std::atomic atomic_char32_t; +#if ETL_USING_8BIT_TYPES typedef std::atomic atomic_uint8_t; typedef std::atomic atomic_int8_t; +#endif typedef std::atomic atomic_uint16_t; typedef std::atomic atomic_int16_t; typedef std::atomic atomic_uint32_t; typedef std::atomic atomic_int32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef std::atomic atomic_uint64_t; typedef std::atomic atomic_int64_t; #endif @@ -586,7 +589,7 @@ namespace etl typedef std::atomic atomic_uint_least16_t; typedef std::atomic atomic_int_least32_t; typedef std::atomic atomic_uint_least32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef std::atomic atomic_int_least64_t; typedef std::atomic atomic_uint_least64_t; #endif @@ -596,7 +599,7 @@ namespace etl typedef std::atomic atomic_uint_fast16_t; typedef std::atomic atomic_int_fast32_t; typedef std::atomic atomic_uint_fast32_t; -#if !defined(ETL_NO_64BIT_TYPES) +#if ETL_USING_64BIT_TYPES typedef std::atomic atomic_int_fast64_t; typedef std::atomic atomic_uint_fast64_t; #endif diff --git a/include/etl/basic_format_spec.h b/include/etl/basic_format_spec.h index ca3da502..43cfe805 100644 --- a/include/etl/basic_format_spec.h +++ b/include/etl/basic_format_spec.h @@ -39,6 +39,165 @@ SOFTWARE. namespace etl { + namespace private_basic_format_spec + { + //******************************************************* + // Structures returned by stream formatting manipulators. + //******************************************************* + struct base_spec + { + ETL_CONSTEXPR base_spec(uint_least8_t base_) + : base(base_) + { + } + + const uint_least8_t base; + }; + + //********************************* + struct width_spec + { + ETL_CONSTEXPR width_spec(uint_least8_t width_) + : width(width_) + { + } + + const uint_least8_t width; + }; + + //********************************* + template + struct fill_spec + { + ETL_CONSTEXPR fill_spec(TChar fill_) + : fill(fill_) + { + } + + const TChar fill; + }; + + //********************************* + struct precision_spec + { + ETL_CONSTEXPR precision_spec(uint_least8_t precision_) + : precision(precision_) + { + } + + const uint_least8_t precision; + }; + + //********************************* + struct uppercase_spec + { + ETL_CONSTEXPR uppercase_spec(bool upper_case_) + : upper_case(upper_case_) + { + } + + const bool upper_case; + }; + + //********************************* + struct boolalpha_spec + { + ETL_CONSTEXPR boolalpha_spec(bool boolalpha_) + : boolalpha(boolalpha_) + { + } + + const bool boolalpha; + }; + + //********************************* + struct showbase_spec + { + ETL_CONSTEXPR showbase_spec(bool show_base_) + : show_base(show_base_) + { + } + + const bool show_base; + }; + + //********************************* + struct left_spec + { + }; + + //********************************* + struct right_spec + { + }; + } + + //*************************************************************************** + // Stream formatting manipulators. + //*************************************************************************** + static ETL_CONSTEXPR private_basic_format_spec::base_spec setbase(uint32_t base) + { + return private_basic_format_spec::base_spec(base); + } + + //********************************* + static ETL_CONSTEXPR private_basic_format_spec::width_spec setw(uint32_t width) + { + return private_basic_format_spec::width_spec(width); + } + + //********************************* + template + static ETL_CONSTEXPR private_basic_format_spec::fill_spec setfill(TChar fill) + { + return private_basic_format_spec::fill_spec(fill); + } + + //********************************* + static ETL_CONSTEXPR private_basic_format_spec::precision_spec setprecision(uint32_t precision) + { + return private_basic_format_spec::precision_spec(precision); + } + + //********************************* + static ETL_CONSTANT private_basic_format_spec::base_spec bin = { 2U }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::base_spec oct = { 8U }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::base_spec dec = { 10U }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::base_spec hex = { 16U }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::left_spec left; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::right_spec right; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::boolalpha_spec boolalpha = { true }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::boolalpha_spec noboolalpha = { false }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::uppercase_spec uppercase = { true }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::uppercase_spec nouppercase = { false }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::showbase_spec showbase = { true }; + + //********************************* + static ETL_CONSTANT private_basic_format_spec::showbase_spec noshowbase = { false }; + + //*************************************************************************** + /// basic_format_spec + //*************************************************************************** template class basic_format_spec { @@ -46,29 +205,61 @@ namespace etl //*************************************************************************** /// Default constructor. - /// Sets:- - /// Base = 10 - /// Width = 0 - /// Upper case (for hex) = true - /// Left Justified = false //*************************************************************************** - basic_format_spec() - : base_(10) - , width_(0) - , precision_(0) - , upper_case_(true) + ETL_CONSTEXPR basic_format_spec() + : base_(10U) + , width_(0U) + , precision_(0U) + , upper_case_(false) , left_justified_(false) , boolalpha_(false) + , show_base_(false) , fill_(typename TString::value_type(' ')) { + } + //*************************************************************************** + /// Cconstructor. + //*************************************************************************** + ETL_CONSTEXPR basic_format_spec(uint_least8_t base__, + uint_least8_t width__, + uint_least8_t precision__, + bool upper_case__, + bool left_justified__, + bool boolalpha__, + bool show_base__, + typename TString::value_type fill__) + : base_(base__) + , width_(width__) + , precision_(precision__) + , upper_case_(upper_case__) + , left_justified_(left_justified__) + , boolalpha_(boolalpha__) + , show_base_(show_base__) + , fill_(fill__) + { + } + + //*************************************************************************** + /// Clears the format spec back to default. + //*************************************************************************** + ETL_CONSTEXPR14 void clear() + { + base_ = 10U; + width_ = 0U; + precision_ = 0U; + upper_case_ = false; + left_justified_ = false; + boolalpha_ = false; + show_base_ = false; + fill_ = typename TString::value_type(' '); } //*************************************************************************** /// Sets the base. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& base(const uint32_t b) + ETL_CONSTEXPR14 basic_format_spec& base(uint32_t b) { base_ = static_cast(b); return *this; @@ -78,7 +269,7 @@ namespace etl /// Sets the base to binary. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& binary() + ETL_CONSTEXPR14 basic_format_spec& binary() { base(2); return *this; @@ -88,7 +279,7 @@ namespace etl /// Sets the base to octal. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& octal() + ETL_CONSTEXPR14 basic_format_spec& octal() { base(8); return *this; @@ -98,7 +289,7 @@ namespace etl /// Sets the base to decimal. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& decimal() + ETL_CONSTEXPR14 basic_format_spec& decimal() { base(10); return *this; @@ -108,7 +299,7 @@ namespace etl /// Sets the base to hex. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& hex() + ETL_CONSTEXPR14 basic_format_spec& hex() { base(16); return *this; @@ -117,16 +308,34 @@ namespace etl //*************************************************************************** /// Gets the base. //*************************************************************************** - uint32_t get_base() const + ETL_CONSTEXPR uint32_t get_base() const { return base_; } + //*************************************************************************** + /// Sets the show base flag. + /// \return A reference to the basic_format_spec. + //*************************************************************************** + ETL_CONSTEXPR14 basic_format_spec& show_base(bool b) + { + show_base_ = b; + return *this; + } + + //*************************************************************************** + /// Gets the show base flag. + //*************************************************************************** + ETL_CONSTEXPR bool is_show_base() const + { + return show_base_; + } + //*************************************************************************** /// Sets the width. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& width(const uint32_t w) + ETL_CONSTEXPR14 basic_format_spec& width(uint32_t w) { width_ = static_cast(w); return *this; @@ -135,7 +344,7 @@ namespace etl //*************************************************************************** /// Gets the width. //*************************************************************************** - uint32_t get_width() const + ETL_CONSTEXPR uint32_t get_width() const { return width_; } @@ -144,16 +353,16 @@ namespace etl /// Sets the precision. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& precision(const uint32_t w) + ETL_CONSTEXPR14 basic_format_spec& precision(uint32_t p) { - precision_ = static_cast(w); + precision_ = static_cast(p); return *this; } //*************************************************************************** /// Gets the precision. //*************************************************************************** - uint32_t get_precision() const + ETL_CONSTEXPR uint32_t get_precision() const { return precision_; } @@ -162,7 +371,7 @@ namespace etl /// Sets the upper case flag. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& upper_case(const bool u) + ETL_CONSTEXPR14 basic_format_spec& upper_case(bool u) { upper_case_ = u; return *this; @@ -171,7 +380,7 @@ namespace etl //*************************************************************************** /// Gets the upper case flag. //*************************************************************************** - bool is_upper_case() const + ETL_CONSTEXPR bool is_upper_case() const { return upper_case_; } @@ -180,7 +389,7 @@ namespace etl /// Sets the fill character. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& fill(const typename TString::value_type c) + ETL_CONSTEXPR14 basic_format_spec& fill(typename TString::value_type c) { fill_ = c; return *this; @@ -189,7 +398,7 @@ namespace etl //*************************************************************************** /// Gets the fill character. //*************************************************************************** - typename TString::value_type get_fill() const + ETL_CONSTEXPR typename TString::value_type get_fill() const { return fill_; } @@ -198,7 +407,7 @@ namespace etl /// Sets the left justify flag. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& left() + ETL_CONSTEXPR14 basic_format_spec& left() { left_justified_ = true; return *this; @@ -207,7 +416,7 @@ namespace etl //*************************************************************************** /// Gets the left justify flag. //*************************************************************************** - bool is_left() const + ETL_CONSTEXPR bool is_left() const { return left_justified_; } @@ -216,7 +425,7 @@ namespace etl /// Sets the right justify flag. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& right() + ETL_CONSTEXPR14 basic_format_spec& right() { left_justified_ = false; return *this; @@ -225,7 +434,7 @@ namespace etl //*************************************************************************** /// Gets the right justify flag. //*************************************************************************** - bool is_right() const + ETL_CONSTEXPR bool is_right() const { return !left_justified_; } @@ -234,7 +443,7 @@ namespace etl /// Sets the bool alpha flag. /// \return A reference to the basic_format_spec. //*************************************************************************** - basic_format_spec& boolalpha(bool b) + ETL_CONSTEXPR14 basic_format_spec& boolalpha(bool b) { boolalpha_ = b; return *this; @@ -243,11 +452,34 @@ namespace etl //*************************************************************************** /// Gets the boolalpha flag. //*************************************************************************** - bool is_boolalpha() const + ETL_CONSTEXPR bool is_boolalpha() const { return boolalpha_; } + //*************************************************************************** + /// Equality operator. + //*************************************************************************** + ETL_CONSTEXPR friend bool operator ==(const basic_format_spec& lhs, const basic_format_spec& rhs) + { + return (lhs.base_ == rhs.base_) && + (lhs.width_ == rhs.width_) && + (lhs.precision_ == rhs.precision_) && + (lhs.upper_case_ == rhs.upper_case_) && + (lhs.left_justified_ == rhs.left_justified_) && + (lhs.boolalpha_ == rhs.boolalpha_) && + (lhs.show_base_ == rhs.show_base_) && + (lhs.fill_ == rhs.fill_); + } + + //*************************************************************************** + /// Inequality operator. + //*************************************************************************** + ETL_CONSTEXPR friend bool operator !=(const basic_format_spec& lhs, const basic_format_spec& rhs) + { + return !(lhs == rhs); + } + private: uint_least8_t base_; @@ -256,6 +488,7 @@ namespace etl bool upper_case_; bool left_justified_; bool boolalpha_; + bool show_base_; typename TString::value_type fill_; }; } diff --git a/include/etl/basic_string.h b/include/etl/basic_string.h index 9a3b2852..011d9f5c 100644 --- a/include/etl/basic_string.h +++ b/include/etl/basic_string.h @@ -50,9 +50,9 @@ SOFTWARE. #include "integral_limits.h" #include "exception.h" #include "memory.h" - -#undef ETL_FILE -#define ETL_FILE "27" +#include "exception.h" +#include "binary.h" +#include "flags.h" #ifdef ETL_COMPILER_GCC #pragma GCC diagnostic push @@ -92,7 +92,7 @@ namespace etl public: string_empty(string_type file_name_, numeric_type line_number_) - : string_exception(ETL_ERROR_TEXT("string:empty", ETL_FILE"A"), file_name_, line_number_) + : string_exception(ETL_ERROR_TEXT("string:empty", ETL_STRING_FILE_ID"A"), file_name_, line_number_) { } }; @@ -106,7 +106,7 @@ namespace etl public: string_out_of_bounds(string_type file_name_, numeric_type line_number_) - : string_exception(ETL_ERROR_TEXT("string:bounds", ETL_FILE"B"), file_name_, line_number_) + : string_exception(ETL_ERROR_TEXT("string:bounds", ETL_STRING_FILE_ID"B"), file_name_, line_number_) { } }; @@ -120,7 +120,7 @@ namespace etl public: string_iterator(string_type file_name_, numeric_type line_number_) - : string_exception(ETL_ERROR_TEXT("string:iterator", ETL_FILE"C"), file_name_, line_number_) + : string_exception(ETL_ERROR_TEXT("string:iterator", ETL_STRING_FILE_ID"C"), file_name_, line_number_) { } }; @@ -134,7 +134,7 @@ namespace etl public: string_truncation(string_type file_name_, numeric_type line_number_) - : string_exception(ETL_ERROR_TEXT("string:iterator", ETL_FILE"D"), file_name_, line_number_) + : string_exception(ETL_ERROR_TEXT("string:iterator", ETL_STRING_FILE_ID"D"), file_name_, line_number_) { } }; @@ -149,10 +149,14 @@ namespace etl typedef size_t size_type; +#if ETL_CPP11_SUPPORTED + static constexpr size_type npos = etl::integral_limits::max; +#else enum { - npos = etl::integral_limits::max + npos = etl::integral_limits::max }; +#endif //************************************************************************* /// Gets the current size of the string. @@ -212,18 +216,30 @@ namespace etl /// Returns the remaining capacity. ///\return The remaining capacity. //************************************************************************* - size_t available() const + size_type available() const { return max_size() - size(); } +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + //************************************************************************* + /// Returns whether the string was truncated by the last operation. + /// Deprecated. Use is_truncated() + ///\return Whether the string was truncated by the last operation. + //************************************************************************* + ETL_DEPRECATED + bool truncated() const + { + return flags.test(); + } + //************************************************************************* /// Returns whether the string was truncated by the last operation. ///\return Whether the string was truncated by the last operation. //************************************************************************* - size_t truncated() const + bool is_truncated() const { - return is_truncated; + return flags.test(); } //************************************************************************* @@ -231,15 +247,17 @@ namespace etl //************************************************************************* void clear_truncated() { - is_truncated = false; + flags.set(); } +#endif +#if ETL_STRING_CLEAR_AFTER_USE_ENABLED //************************************************************************* /// Sets the 'secure' flag to the requested state. //************************************************************************* void set_secure() { - clear_afer_use = true; + flags.set(); } //************************************************************************* @@ -247,22 +265,31 @@ namespace etl //************************************************************************* bool is_secure() const { - return clear_afer_use; + return flags.test(); } +#endif protected: //************************************************************************* /// Constructor. //************************************************************************* - string_base(size_t max_size_) - : is_truncated(false) - , clear_afer_use(false) - , current_size(0) + string_base(size_type max_size_) + : current_size(0) , CAPACITY(max_size_) { } +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + //************************************************************************* + /// Sets the 'truncated' flag. + //************************************************************************* + void set_truncated(bool status) + { + flags.set(status); + } +#endif + //************************************************************************* /// Destructor. //************************************************************************* @@ -270,10 +297,15 @@ namespace etl { } - bool is_truncated; ///< Set to true if the operation truncated the string. - bool clear_afer_use; ///< Set to true if the string must be cleared after use. + static const uint_least8_t IS_TRUNCATED = etl::bit<0>::value; + static const uint_least8_t CLEAR_AFTER_USE = etl::bit<1>::value; + size_type current_size; ///< The current number of elements in the string. const size_type CAPACITY; ///< The maximum number of elements in the string. + +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED || ETL_STRING_CLEAR_AFTER_USE_ENABLED + etl::flags flags; +#endif }; //*************************************************************************** @@ -297,7 +329,6 @@ namespace etl typedef const T* const_iterator; typedef ETL_OR_STD::reverse_iterator reverse_iterator; typedef ETL_OR_STD::reverse_iterator const_reverse_iterator; - typedef size_t size_type; typedef typename etl::iterator_traits::difference_type difference_type; @@ -414,7 +445,7 @@ namespace etl /// If asserts or exceptions are enabled and the new size is larger than the ///\param new_size The new size. //********************************************************************* - void resize(size_t new_size) + void resize(size_type new_size) { resize(new_size, 0); } @@ -424,14 +455,16 @@ namespace etl ///\param new_size The new size. ///\param value The value to fill new elements with. Default = default constructed value. //********************************************************************* - void resize(size_t new_size, T value) + void resize(size_type new_size, T value) { if (new_size > CAPACITY) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } @@ -448,12 +481,25 @@ namespace etl cleanup(); } + //********************************************************************* + /// Resizes the string, but doesn't initialise the free space + /// except for a terminator null. + ///\param new_size The new size. + //********************************************************************* + void uninitialized_resize(size_type new_size) + { + new_size = etl::min(new_size, CAPACITY); + + current_size = new_size; + p_buffer[new_size] = 0; + } + //********************************************************************* /// Returns a reference to the value at index 'i' ///\param i The index. ///\return A reference to the value at index 'i' //********************************************************************* - reference operator [](size_t i) + reference operator [](size_type i) { return p_buffer[i]; } @@ -463,7 +509,7 @@ namespace etl ///\param i The index. ///\return A const reference to the value at index 'i' //********************************************************************* - const_reference operator [](size_t i) const + const_reference operator [](size_type i) const { return p_buffer[i]; } @@ -474,7 +520,7 @@ namespace etl ///\param i The index. ///\return A reference to the value at index 'i' //********************************************************************* - reference at(size_t i) + reference at(size_type i) { ETL_ASSERT(i < size(), ETL_ERROR(string_out_of_bounds)); return p_buffer[i]; @@ -486,7 +532,7 @@ namespace etl ///\param i The index. ///\return A const reference to the value at index 'i' //********************************************************************* - const_reference at(size_t i) const + const_reference at(size_type i) const { ETL_ASSERT(i < size(), ETL_ERROR(string_out_of_bounds)); return p_buffer[i]; @@ -546,6 +592,24 @@ namespace etl return p_buffer; } + //********************************************************************* + /// Returns a pointer to the beginning of the string data. + ///\return A pointer to the beginning of the string data. + //********************************************************************* + pointer data_end() + { + return p_buffer + current_size; + } + + //********************************************************************* + /// Returns a const pointer to the beginning of the string data. + ///\return A const pointer to the beginning of the string data. + //********************************************************************* + const_pointer data_end() const + { + return p_buffer + current_size; + } + //********************************************************************* /// Assigns values to the string. /// Truncates if the string does not have enough free space. @@ -555,14 +619,23 @@ namespace etl { assign(other.begin(), other.end()); - if (other.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (other.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif + +#if ETL_STRING_CLEAR_AFTER_USE_ENABLED + if (other.is_secure()) + { + set_secure(); + } +#endif cleanup(); } @@ -574,7 +647,7 @@ namespace etl ///\param subposition The position to start from. ///\param sublength The length to copy. //********************************************************************* - void assign(const etl::ibasic_string& other, size_t subposition, size_t sublength) + void assign(const etl::ibasic_string& other, size_type subposition, size_type sublength) { if (sublength == npos) { @@ -584,6 +657,24 @@ namespace etl ETL_ASSERT(subposition <= other.size(), ETL_ERROR(string_out_of_bounds)); assign(other.begin() + subposition, sublength); + +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (other.is_truncated()) + { + this->set_truncated(true); + +#if defined(ETL_STRING_TRUNCATION_IS_ERROR) + ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif + } +#endif + +#if ETL_STRING_CLEAR_AFTER_USE_ENABLED + if (other.is_secure()) + { + set_secure(); + } +#endif } //********************************************************************* @@ -600,10 +691,12 @@ namespace etl p_buffer[current_size++] = *other++; } - is_truncated = (*other != 0); +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(*other != 0); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) - ETL_ASSERT(is_truncated == false, ETL_ERROR(string_truncation)) + ETL_ASSERT(flags.test() == false, ETL_ERROR(string_truncation)) +#endif #endif p_buffer[current_size] = 0; @@ -615,14 +708,16 @@ namespace etl ///\param other The other string. ///\param length The length to copy. //********************************************************************* - void assign(const_pointer other, size_t length_) + void assign(const_pointer other, size_type length_) { initialise(); - is_truncated = (length_ > CAPACITY); +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(length_ > CAPACITY); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) - ETL_ASSERT(is_truncated == false, ETL_ERROR(string_truncation)) + ETL_ASSERT(flags.test() == false, ETL_ERROR(string_truncation)) +#endif #endif length_ = etl::min(length_, CAPACITY); @@ -657,10 +752,12 @@ namespace etl p_buffer[current_size] = 0; - is_truncated = (first != last); +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(first != last); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) - ETL_ASSERT(is_truncated == false, ETL_ERROR(string_truncation)) + ETL_ASSERT(flags.test() == false, ETL_ERROR(string_truncation)) +#endif #endif } @@ -670,14 +767,16 @@ namespace etl ///\param n The number of elements to add. ///\param value The value to insert for each element. //********************************************************************* - void assign(size_t n, T value) + void assign(size_type n, T value) { initialise(); - is_truncated = (n > CAPACITY); +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(n > CAPACITY); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) - ETL_ASSERT(is_truncated == false, ETL_ERROR(string_truncation)) + ETL_ASSERT(flags.test() == false, ETL_ERROR(string_truncation)) +#endif #endif n = etl::min(n, CAPACITY); @@ -709,10 +808,12 @@ namespace etl } else { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } } @@ -737,14 +838,16 @@ namespace etl { insert(end(), str.begin(), str.end()); - if (str.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (str.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif return *this; } @@ -755,7 +858,7 @@ namespace etl ///\param subposition The position in str. ///\param sublength The number of characters. //********************************************************************* - ibasic_string& append(const ibasic_string& str, size_t subposition, size_t sublength = npos) + ibasic_string& append(const ibasic_string& str, size_type subposition, size_type sublength = npos) { ETL_ASSERT(subposition <= str.size(), ETL_ERROR(string_out_of_bounds)); @@ -779,7 +882,7 @@ namespace etl ///\param str The string to append. ///\param n The number of characters. //********************************************************************* - ibasic_string& append(const T* str, size_t n) + ibasic_string& append(const T* str, size_type n) { insert(size(), str, n); return *this; @@ -790,7 +893,7 @@ namespace etl ///\param n The number of characters. ///\param c The character. //********************************************************************* - ibasic_string& append(size_t n, T c) + ibasic_string& append(size_type n, T c) { insert(size(), n, c); return *this; @@ -845,10 +948,12 @@ namespace etl *insert_position = value; } - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } @@ -863,7 +968,7 @@ namespace etl ///\param n The number of elements to add. ///\param value The value to insert. //********************************************************************* - void insert(const_iterator position, size_t n, T value) + void insert(const_iterator position, size_type n, T value) { if (n == 0) { @@ -872,15 +977,17 @@ namespace etl // Quick hack, as iterators are pointers. iterator insert_position = const_cast(position); - const size_t start = etl::distance(cbegin(), position); + const size_type start = etl::distance(cbegin(), position); // No effect. if (start >= CAPACITY) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif return; } @@ -890,10 +997,12 @@ namespace etl { if ((current_size + n) > CAPACITY) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } @@ -903,20 +1012,23 @@ namespace etl else { // Lets do some shifting. - const size_t shift_amount = n; - const size_t to_position = start + shift_amount; - const size_t remaining_characters = current_size - start; - const size_t max_shift_characters = CAPACITY - start - shift_amount; - const size_t characters_to_shift = etl::min(max_shift_characters, remaining_characters); + const size_type shift_amount = n; + const size_type to_position = start + shift_amount; + const size_type remaining_characters = current_size - start; + const size_type max_shift_characters = CAPACITY - start - shift_amount; + const size_type characters_to_shift = etl::min(max_shift_characters, remaining_characters); // Will the string truncate? if ((start + shift_amount + remaining_characters) > CAPACITY) { current_size = CAPACITY; - is_truncated = true; + +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } else @@ -946,16 +1058,18 @@ namespace etl return; } - const size_t start = etl::distance(begin(), position); - const size_t n = etl::distance(first, last); + const size_type start = etl::distance(begin(), position); + const size_type n = etl::distance(first, last); // No effect. if (start >= CAPACITY) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif return; } @@ -965,10 +1079,12 @@ namespace etl { if (((current_size + n) > CAPACITY)) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } @@ -982,20 +1098,23 @@ namespace etl else { // Lets do some shifting. - const size_t shift_amount = n; - const size_t to_position = start + shift_amount; - const size_t remaining_characters = current_size - start; - const size_t max_shift_characters = CAPACITY - start - shift_amount; - const size_t characters_to_shift = etl::min(max_shift_characters, remaining_characters); + const size_type shift_amount = n; + const size_type to_position = start + shift_amount; + const size_type remaining_characters = current_size - start; + const size_type max_shift_characters = CAPACITY - start - shift_amount; + const size_type characters_to_shift = etl::min(max_shift_characters, remaining_characters); // Will the string truncate? if ((start + shift_amount + remaining_characters) > CAPACITY) { current_size = CAPACITY; - is_truncated = true; + +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } else @@ -1019,20 +1138,22 @@ namespace etl ///\param position The position to insert before. ///\param str The string to insert. //********************************************************************* - etl::ibasic_string& insert(size_t position, const etl::ibasic_string& str) + etl::ibasic_string& insert(size_type position, const etl::ibasic_string& str) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); insert(begin() + position, str.cbegin(), str.cend()); - if (str.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (str.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif return *this; } @@ -1044,7 +1165,7 @@ namespace etl ///\param subposition The subposition to start from. ///\param sublength The number of characters to insert. //********************************************************************* - etl::ibasic_string& insert(size_t position, const etl::ibasic_string& str, size_t subposition, size_t sublength) + etl::ibasic_string& insert(size_type position, const etl::ibasic_string& str, size_type subposition, size_type sublength) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); ETL_ASSERT(subposition <= str.size(), ETL_ERROR(string_out_of_bounds)); @@ -1056,14 +1177,16 @@ namespace etl insert(begin() + position, str.cbegin() + subposition, str.cbegin() + subposition + sublength); - if (str.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (str.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif return *this; } @@ -1073,7 +1196,7 @@ namespace etl ///\param position The position to insert before. ///\param s The string to insert. //********************************************************************* - etl::ibasic_string& insert(size_t position, const_pointer s) + etl::ibasic_string& insert(size_type position, const_pointer s) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1087,7 +1210,7 @@ namespace etl ///\param s The string to insert. ///\param n The number of characters to insert. //********************************************************************* - etl::ibasic_string& insert(size_t position, const_pointer s, size_t n) + etl::ibasic_string& insert(size_type position, const_pointer s, size_type n) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1101,7 +1224,7 @@ namespace etl ///\param n The number of characters to insert. ///\param c The character to insert. //********************************************************************* - etl::ibasic_string& insert(size_t position, size_t n, value_type c) + etl::ibasic_string& insert(size_type position, size_type n, value_type c) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1115,7 +1238,7 @@ namespace etl ///\param length Number of characters. ///\return A refernce to this string. //********************************************************************* - etl::ibasic_string& erase(size_t position, size_t length_ = npos) + etl::ibasic_string& erase(size_type position, size_type length_ = npos) { // Limit the length. length_ = etl::min(length_, size() - position); @@ -1148,8 +1271,13 @@ namespace etl //********************************************************************* iterator erase(iterator first, iterator last) { + if (first == last) + { + return first; + } + etl::copy(last, end(), first); - size_t n_delete = etl::distance(first, last); + size_type n_delete = etl::distance(first, last); current_size -= n_delete; p_buffer[current_size] = 0; @@ -1172,20 +1300,22 @@ namespace etl ///\param len The number of characters to copy. ///\param pos The position to start copying from. //********************************************************************* - size_t copy(pointer s, size_t len, size_t pos = 0) + size_type copy(pointer s, size_type len, size_type pos = 0) { if ((pos + len > size())) { - is_truncated = true; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); +#endif #endif } - size_t endpos = etl::min(pos + len, size()); + size_type endpos = etl::min(pos + len, size()); - for (size_t i = pos; i < endpos; ++i) + for (size_type i = pos; i < endpos; ++i) { *s++ = p_buffer[i]; } @@ -1198,7 +1328,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find(const ibasic_string& str, size_t pos = 0) const + size_type find(const ibasic_string& str, size_type pos = 0) const { if ((pos + str.size()) > size()) { @@ -1222,7 +1352,7 @@ namespace etl ///\param s Pointer to the content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find(const_pointer s, size_t pos = 0) const + size_type find(const_pointer s, size_type pos = 0) const { #if defined(ETL_DEBUG) if ((pos + etl::strlen(s)) > size()) @@ -1249,7 +1379,7 @@ namespace etl ///\param pos The position to start searching from. ///\param n The number of characters to search for. //********************************************************************* - size_t find(const_pointer s, size_t pos, size_t n) const + size_type find(const_pointer s, size_type pos, size_type n) const { #if defined(ETL_DEBUG) if ((pos + etl::strlen(s) - n) > size()) @@ -1275,7 +1405,7 @@ namespace etl ///\param c The character to find. ///\param position The position to start searching from. //********************************************************************* - size_t find(T c, size_t position = 0) const + size_type find(T c, size_type position = 0) const { const_iterator i = etl::find(begin() + position, end(), c); @@ -1294,7 +1424,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t rfind(const ibasic_string& str, size_t position = npos) const + size_type rfind(const ibasic_string& str, size_type position = npos) const { if ((str.size()) > size()) { @@ -1325,9 +1455,9 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t rfind(const_pointer s, size_t position = npos) const + size_type rfind(const_pointer s, size_type position = npos) const { - size_t len = etl::strlen(s); + size_type len = etl::strlen(s); if (len > size()) { @@ -1361,7 +1491,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t rfind(const_pointer s, size_t position, size_t length_) const + size_type rfind(const_pointer s, size_type position, size_type length_) const { if (length_ > size()) { @@ -1395,7 +1525,7 @@ namespace etl ///\param c The character to find ///\param pos The position to start searching from. //********************************************************************* - size_t rfind(T c, size_t position = npos) const + size_type rfind(T c, size_type position = npos) const { if (position >= size()) { @@ -1422,7 +1552,7 @@ namespace etl ///\param length The number of characters to replace. ///\param str The string to replace it with. //********************************************************************* - ibasic_string& replace(size_t position, size_t length_, const ibasic_string& str) + ibasic_string& replace(size_type position, size_type length_, const ibasic_string& str) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1456,14 +1586,16 @@ namespace etl // Insert the new stuff. insert(first_, str.begin(), str.end()); - if (str.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (str.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif return *this; } @@ -1471,7 +1603,7 @@ namespace etl //********************************************************************* /// Replace characters from 'position' of 'length' with 'str' from 'subpsotion' of 'sublength'. //********************************************************************* - ibasic_string& replace(size_t position, size_t length_, const ibasic_string& str, size_t subposition, size_t sublength) + ibasic_string& replace(size_type position, size_type length_, const ibasic_string& str, size_type subposition, size_type sublength) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); ETL_ASSERT(subposition <= str.size(), ETL_ERROR(string_out_of_bounds)); @@ -1486,14 +1618,16 @@ namespace etl // Insert the new stuff. insert(position, str, subposition, sublength); - if (str.truncated()) +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + if (str.is_truncated()) { - is_truncated = true; + set_truncated(true); #if defined(ETL_STRING_TRUNCATION_IS_ERROR) ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation)); #endif } +#endif return *this; } @@ -1501,7 +1635,7 @@ namespace etl //********************************************************************* /// Replace characters from 'position' of 'length' with pointed to string. //********************************************************************* - ibasic_string& replace(size_t position, size_t length_, const_pointer s) + ibasic_string& replace(size_type position, size_type length_, const_pointer s) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1538,7 +1672,7 @@ namespace etl //********************************************************************* /// Replace characters from 'position' of 'length' with 'n' characters from pointed to string. //********************************************************************* - ibasic_string& replace(size_t position, size_t length_, const_pointer s, size_t n) + ibasic_string& replace(size_type position, size_type length_, const_pointer s, size_type n) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1557,7 +1691,7 @@ namespace etl //********************************************************************* /// Replace characters from 'first' to 'last' with 'n' characters from pointed to string. //********************************************************************* - ibasic_string& replace(const_iterator first, const_iterator last, const_pointer s, size_t n) + ibasic_string& replace(const_iterator first, const_iterator last, const_pointer s, size_type n) { // Quick hack, as iterators are pointers. iterator first_ = const_cast(first); @@ -1575,7 +1709,7 @@ namespace etl //********************************************************************* /// Replace characters from 'position' of 'length' with 'n' copies of 'c'. //********************************************************************* - ibasic_string& replace(size_t position, size_t length_, size_t n, value_type c) + ibasic_string& replace(size_type position, size_type length_, size_type n, value_type c) { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1594,7 +1728,7 @@ namespace etl //********************************************************************* /// Replace characters from 'first' of 'last' with 'n' copies of 'c'. //********************************************************************* - ibasic_string& replace(const_iterator first, const_iterator last, size_t n, value_type c) + ibasic_string& replace(const_iterator first, const_iterator last, size_type n, value_type c) { // Quick hack, as iterators are pointers. iterator first_ = const_cast(first); @@ -1642,7 +1776,7 @@ namespace etl //************************************************************************* /// Compare position / length with string. //************************************************************************* - int compare(size_t position, size_t length_, const ibasic_string& str) const + int compare(size_type position, size_type length_, const ibasic_string& str) const { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); @@ -1658,7 +1792,7 @@ namespace etl //************************************************************************* /// Compare position / length with string / subposition / sublength. //************************************************************************* - int compare(size_t position, size_t length_, const ibasic_string& str, size_t subposition, size_t sublength) const + int compare(size_type position, size_type length_, const ibasic_string& str, size_type subposition, size_type sublength) const { ETL_ASSERT(position <= size(), ETL_ERROR(string_out_of_bounds)); ETL_ASSERT(subposition <= str.size(), ETL_ERROR(string_out_of_bounds)); @@ -1687,7 +1821,7 @@ namespace etl //************************************************************************* /// Compare position / length with C string. //************************************************************************* - int compare(size_t position, size_t length_, const_pointer s) const + int compare(size_type position, size_type length_, const_pointer s) const { return compare(p_buffer + position, p_buffer + position + length_, @@ -1698,7 +1832,7 @@ namespace etl //************************************************************************* /// Compare position / length with C string / n. //************************************************************************* - int compare(size_t position, size_t length_, const_pointer s, size_t n) const + int compare(size_type position, size_type length_, const_pointer s, size_type n) const { return compare(p_buffer + position, p_buffer + position + length_, @@ -1711,7 +1845,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_of(const ibasic_string& str, size_t position = 0) const + size_type find_first_of(const ibasic_string& str, size_type position = 0) const { return find_first_of(str.c_str(), position, str.size()); } @@ -1721,7 +1855,7 @@ namespace etl ///\param s Pointer to the content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_of(const_pointer s, size_t position = 0) const + size_type find_first_of(const_pointer s, size_type position = 0) const { return find_first_of(s, position, etl::strlen(s)); } @@ -1732,13 +1866,13 @@ namespace etl ///\param pos The position to start searching from. ///\param n The number of characters to search for. //********************************************************************* - size_t find_first_of(const_pointer s, size_t position, size_t n) const + size_type find_first_of(const_pointer s, size_type position, size_type n) const { if (position < size()) { - for (size_t i = position; i < size(); ++i) + for (size_type i = position; i < size(); ++i) { - for (size_t j = 0; j < n; ++j) + for (size_type j = 0; j < n; ++j) { if (p_buffer[i] == s[j]) { @@ -1756,11 +1890,11 @@ namespace etl ///\param c The character to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_of(value_type c, size_t position = 0) const + size_type find_first_of(value_type c, size_type position = 0) const { if (position < size()) { - for (size_t i = position; i < size(); ++i) + for (size_type i = position; i < size(); ++i) { if (p_buffer[i] == c) { @@ -1777,7 +1911,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_last_of(const ibasic_string& str, size_t position = npos) const + size_type find_last_of(const ibasic_string& str, size_type position = npos) const { return find_last_of(str.c_str(), position, str.size()); } @@ -1787,7 +1921,7 @@ namespace etl ///\param s Pointer to the content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_last_of(const_pointer s, size_t position = npos) const + size_type find_last_of(const_pointer s, size_type position = npos) const { return find_last_of(s, position, etl::strlen(s)); } @@ -1798,7 +1932,7 @@ namespace etl ///\param pos The position to start searching from. ///\param n The number of characters to search for. //********************************************************************* - size_t find_last_of(const_pointer s, size_t position, size_t n) const + size_type find_last_of(const_pointer s, size_type position, size_type n) const { if (empty()) { @@ -1811,7 +1945,7 @@ namespace etl while (it != rend()) { - for (size_t j = 0; j < n; ++j) + for (size_type j = 0; j < n; ++j) { if (p_buffer[position] == s[j]) { @@ -1831,7 +1965,7 @@ namespace etl ///\param c The character to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_last_of(value_type c, size_t position = npos) const + size_type find_last_of(value_type c, size_type position = npos) const { if (empty()) { @@ -1861,7 +1995,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_not_of(const ibasic_string& str, size_t position = 0) const + size_type find_first_not_of(const ibasic_string& str, size_type position = 0) const { return find_first_not_of(str.c_str(), position, str.size()); } @@ -1871,7 +2005,7 @@ namespace etl ///\param s Pointer to the content to not find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_not_of(const_pointer s, size_t position = 0) const + size_type find_first_not_of(const_pointer s, size_type position = 0) const { return find_first_not_of(s, position, etl::strlen(s)); } @@ -1882,15 +2016,15 @@ namespace etl ///\param pos The position to start searching from. ///\param n The number of characters to search for. //********************************************************************* - size_t find_first_not_of(const_pointer s, size_t position, size_t n) const + size_type find_first_not_of(const_pointer s, size_type position, size_type n) const { if (position < size()) { - for (size_t i = position; i < size(); ++i) + for (size_type i = position; i < size(); ++i) { bool found = false; - for (size_t j = 0; j < n; ++j) + for (size_type j = 0; j < n; ++j) { if (p_buffer[i] == s[j]) { @@ -1913,11 +2047,11 @@ namespace etl ///\param c The character to not find ///\param pos The position to start searching from. //********************************************************************* - size_t find_first_not_of(value_type c, size_t position = 0) const + size_type find_first_not_of(value_type c, size_type position = 0) const { if (position < size()) { - for (size_t i = position; i < size(); ++i) + for (size_type i = position; i < size(); ++i) { if (p_buffer[i] != c) { @@ -1934,7 +2068,7 @@ namespace etl ///\param str The content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_last_not_of(const ibasic_string& str, size_t position = npos) const + size_type find_last_not_of(const ibasic_string& str, size_type position = npos) const { return find_last_not_of(str.c_str(), position, str.size()); } @@ -1944,7 +2078,7 @@ namespace etl ///\param s The pointer to the content to find ///\param pos The position to start searching from. //********************************************************************* - size_t find_last_not_of(const_pointer s, size_t position = npos) const + size_type find_last_not_of(const_pointer s, size_type position = npos) const { return find_last_not_of(s, position, etl::strlen(s)); } @@ -1955,7 +2089,7 @@ namespace etl ///\param pos The position to start searching from. ///\param n The number of characters to use. //********************************************************************* - size_t find_last_not_of(const_pointer s, size_t position, size_t n) const + size_type find_last_not_of(const_pointer s, size_type position, size_type n) const { if (empty()) { @@ -1970,7 +2104,7 @@ namespace etl { bool found = false; - for (size_t j = 0; j < n; ++j) + for (size_type j = 0; j < n; ++j) { if (p_buffer[position] == s[j]) { @@ -1993,7 +2127,7 @@ namespace etl //********************************************************************* // //********************************************************************* - size_t find_last_not_of(value_type c, size_t position = npos) const + size_type find_last_not_of(value_type c, size_type position = npos) const { if (empty()) { @@ -2066,7 +2200,7 @@ namespace etl //************************************************************************* ibasic_string& operator += (T rhs) { - append(size_t(1), rhs); + append(size_type(1), rhs); return *this; } @@ -2078,12 +2212,38 @@ namespace etl virtual void repair() = 0; #endif + //********************************************************************* + /// Clears the free space to string terminator value. + //********************************************************************* + void initialize_free_space() + { +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(false); +#endif + etl::fill(&p_buffer[current_size], &p_buffer[CAPACITY + 1U], T(0)); + } + + //********************************************************************* + /// Trim the size to the distance to the first null terminator. + /// If the last buffer position has a non-null value then the truncated + /// flag will be set. + //********************************************************************* + void trim_to_terminator() + { +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(p_buffer[CAPACITY] != T(0)); +#endif + + p_buffer[CAPACITY] = T(0); // Ensure a terminating null. + current_size = etl::strlen(p_buffer); + } + protected: //********************************************************************* /// Constructor. //********************************************************************* - ibasic_string(T* p_buffer_, size_t MAX_SIZE_) + ibasic_string(T* p_buffer_, size_type MAX_SIZE_) : string_base(MAX_SIZE_), p_buffer(p_buffer_) { @@ -2094,10 +2254,12 @@ namespace etl //********************************************************************* void initialise() { - current_size = 0; + current_size = 0U; cleanup(); p_buffer[0] = 0; - is_truncated = false; +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(false); +#endif } //************************************************************************* @@ -2155,10 +2317,12 @@ namespace etl //************************************************************************* void cleanup() { +#if ETL_STRING_CLEAR_AFTER_USE_ENABLED if (is_secure()) { etl::memory_clear_range(&p_buffer[current_size], &p_buffer[CAPACITY]); } +#endif } //************************************************************************* @@ -2182,10 +2346,12 @@ namespace etl #endif ~ibasic_string() { +#if ETL_STRING_CLEAR_AFTER_USE_ENABLED if (is_secure()) { initialise(); } +#endif } }; @@ -2434,6 +2600,4 @@ namespace etl #pragma GCC diagnostic pop #endif -#undef ETL_FILE - #endif diff --git a/include/etl/basic_string_stream.h b/include/etl/basic_string_stream.h new file mode 100644 index 00000000..511913e0 --- /dev/null +++ b/include/etl/basic_string_stream.h @@ -0,0 +1,269 @@ +///\file + +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2020 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_BASIC_STRING_STREAM_INCLUDED +#define ETL_BASIC_STRING_STREAM_INCLUDED + +///\ingroup string + +#include "platform.h" + +namespace etl +{ + template + class basic_string_stream + { + public: + + typedef TFormat format_spec_type; + typedef TIString istring_type; + typedef typename TIString::value_type value_type; + typedef typename TIString::const_pointer const_pointer; + + //************************************************************************* + /// Construct from text. + //************************************************************************* + explicit basic_string_stream(TIString& text_) + : text(text_) + { + } + + //************************************************************************* + /// Construct from text and format spec. + //************************************************************************* + basic_string_stream(TIString& text_, const TFormat& spec_) + : text(text_) + , spec(spec_) + { + } + + //************************************************************************* + /// Set the format spec. + //************************************************************************* + void set_format(const TFormat& spec_) + { + spec = spec_; + } + + //************************************************************************* + /// Get a const reference to the format spec. + //************************************************************************* + const TFormat& get_format() const + { + return spec; + } + + //************************************************************************* + /// Get a reference to the current string. + //************************************************************************* + TIString& str() + { + return text; + } + + //************************************************************************* + /// Get a const reference to the current string. + //************************************************************************* + const TIString& str() const + { + return text; + } + + //************************************************************************* + /// Resets the stream to the supplied string. + //************************************************************************* + void str(const value_type* p) + { + text.assign(p); + } + + //************************************************************************* + /// Resets the stream to the supplied string. + //************************************************************************* + void str(const TIString& is) + { + text.assign(is); + } + + //************************************************************************* + /// Stream operators. + //************************************************************************* + + //********************************* + /// TFormat + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, const TFormat& spec) + { + ss.spec = spec; + return ss; + } + + //********************************* + /// etl::base_spec from etl::setbase, etl::bin, etl::oct, etl::dec & etl::hex stream manipulators + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::base_spec spec) + { + ss.spec.base(spec.base); + return ss; + } + + //********************************* + /// etl::width_spec from etl::setw stream manipulator + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::width_spec spec) + { + ss.spec.width(spec.width); + return ss; + } + + //********************************* + /// etl::fill_spec from etl::setfill stream manipulator + //********************************* + template + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::fill_spec spec) + { + ss.spec.fill(spec.fill); + return ss; + } + + //********************************* + /// etl::precision_spec from etl::setprecision stream manipulator + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::precision_spec spec) + { + ss.spec.precision(spec.precision); + return ss; + } + + //********************************* + /// etl::boolalpha_spec from etl::boolalpha & etl::noboolalpha stream manipulators + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::boolalpha_spec spec) + { + ss.spec.boolalpha(spec.boolalpha); + return ss; + } + + //********************************* + /// etl::uppercase_spec from etl::uppercase & etl::nouppercase stream manipulators + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::uppercase_spec spec) + { + ss.spec.upper_case(spec.upper_case); + return ss; + } + + //********************************* + /// etl::showbase_spec from etl::showbase & etl::noshowbase stream manipulators + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::showbase_spec spec) + { + ss.spec.show_base(spec.show_base); + return ss; + } + + //********************************* + /// etl::left_spec from etl::left stream manipulator + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::left_spec spec) + { + ss.spec.left(); + return ss; + } + + //********************************* + /// etl::right_spec from etl::left stream manipulator + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::right_spec spec) + { + ss.spec.right(); + return ss; + } + + //********************************* + /// From a string view + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, TStringView view) + { + etl::to_string(view, ss.text, ss.spec, true); + return ss; + } + + //********************************* + /// From a const pointer to a string + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, const_pointer p) + { + TStringView view(p); + ss << view; + return ss; + } + + //********************************* + /// From a string interface + //********************************* + friend basic_string_stream& operator <<(basic_string_stream& ss, const TIString& text) + { + etl::to_string(text, ss.text, ss.spec, true); + return ss; + } + + //********************************* + /// From a string + //********************************* + template