Merge branch 'feature/#774-Truncating-access-for-etl-bitset' into development

# Conflicts:
#	test/vs2022/etl.vcxproj.filters
This commit is contained in:
John Wellbelove 2024-01-20 18:32:59 +00:00
commit 816e87ae00
14 changed files with 8279 additions and 5443 deletions

View File

@ -1,5 +1,5 @@
{
"name": "Embedded Template Library - Arduino",
"name": "Embedded Template Library - ETL",
"version": "20.38.10",
"authors": {
"name": "John Wellbelove",

View File

@ -1,7 +1,7 @@
name=Embedded Template Library - Arduino
name=Embedded Template Library - ETL
version=20.38.10
author= John Wellbelove <john.wellbelove@etlcpp.com>
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
author= John Wellbelove <arduino@etlcpp.com>
maintainer=John Wellbelove <arduino@etlcpp.com>
license=MIT
sentence=ETL. A C++ template library tailored for embedded systems.
paragraph=

View File

@ -2286,7 +2286,7 @@ namespace etl
//***********************************
ETL_NODISCARD
ETL_CONSTEXPR
T operator ()(T value) ETL_NOEXCEPT
T operator ()(T value) const ETL_NOEXCEPT
{
ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
@ -2311,7 +2311,7 @@ namespace etl
//***********************************
ETL_NODISCARD
ETL_CONSTEXPR
T operator ()(T value) ETL_NOEXCEPT
T operator ()(T value) const ETL_NOEXCEPT
{
ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
@ -2340,7 +2340,7 @@ namespace etl
//***********************************
ETL_NODISCARD
ETL_CONSTEXPR
T operator ()(T value) ETL_NOEXCEPT
T operator ()(T value) const ETL_NOEXCEPT
{
ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
@ -2369,7 +2369,7 @@ namespace etl
//***********************************
ETL_NODISCARD
ETL_CONSTEXPR
T operator ()(T value) ETL_NOEXCEPT
T operator ()(T value) const ETL_NOEXCEPT
{
ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");

View File

@ -62,17 +62,17 @@ namespace etl
/// An implementation of a bloom filter.
/// Allows up to three hashes to be defined.
/// Hashes must support the () operator and define 'argument_type'.
///\tparam DESIRED_WIDTH The desired number of hash results that can be stored. Rounded up to best fit the underlying bitset.
///\tparam Desired_Width The desired number of hash results that can be stored. Rounded up to best fit the underlying bitset.
///\tparam THash1 The first hash generator class.
///\tparam THash2 The second hash generator class. If omitted, uses the null hash.
///\tparam THash3 The third hash generator class. If omitted, uses the null hash.
/// The hash classes must define <b>argument_type</b>.
///\ingroup bloom_filter
//***************************************************************************
template <size_t DESIRED_WIDTH,
typename THash1,
typename THash2 = private_bloom_filter::null_hash,
typename THash3 = private_bloom_filter::null_hash>
template <size_t Desired_Width,
typename THash1,
typename THash2 = private_bloom_filter::null_hash,
typename THash3 = private_bloom_filter::null_hash>
class bloom_filter
{
private:
@ -85,7 +85,7 @@ namespace etl
enum
{
// Make the most efficient use of the bitset.
WIDTH = etl::bitset<DESIRED_WIDTH>::ALLOCATED_BITS
WIDTH = etl::bitset<Desired_Width>::Allocated_Bits
};
//***************************************************************************

View File

@ -257,7 +257,6 @@ SOFTWARE.
#define ETL_CONSTEXPR constexpr
#define ETL_CONSTEXPR11 constexpr // Synonym for ETL_CONSTEXPR
#define ETL_CONSTANT constexpr
#define ETL_STATIC_CONSTANT constexpr
#define ETL_DELETE = delete
#define ETL_EXPLICIT explicit
#define ETL_OVERRIDE override
@ -279,7 +278,6 @@ SOFTWARE.
#define ETL_CONSTEXPR
#define ETL_CONSTEXPR11
#define ETL_CONSTANT const
#define ETL_STATIC_CONSTANT static const
#define ETL_DELETE
#define ETL_EXPLICIT
#define ETL_OVERRIDE

File diff suppressed because it is too large Load Diff

View File

@ -190,7 +190,9 @@ namespace UnitTest
if (!(expected == actual))
{
UnitTest::MemoryOutStream stream;
stream << std::hex << std::uppercase << std::setfill('0') << "Expected 0x" << std::setw(2 * sizeof(Expected)) << expected << " but was 0x" << std::setw(2 * sizeof(Actual)) << actual;
stream << std::hex << std::uppercase << std::setfill('0')
<< "Expected 0x" << std::setw(2 * sizeof(Expected)) << (expected & ~(typename std::make_unsigned<Expected>::type(0)))
<< " but was 0x" << std::setw(2 * sizeof(Actual)) << (actual & ~(typename std::make_unsigned<Actual>::type(0)));
results.OnTestFailure(details, stream.GetText());
}
@ -214,7 +216,8 @@ namespace UnitTest
if (expected == actual)
{
UnitTest::MemoryOutStream stream;
stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual)) << "Expected not equal, but both values are " << actual;
stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual))
<< "Expected not equal, but both values are " << (actual & ~(typename std::make_unsigned<Actual>::type(0)));
results.OnTestFailure(details, stream.GetText());
}

View File

@ -0,0 +1,239 @@
/******************************************************************************
The MIT License(MIT)
Embedded Template Library.
https://github.com/ETLCPP/etl
https://www.etlcpp.com
Copyright(c) 2022 John Wellbelove
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.
******************************************************************************/
#include "unit_test_framework.h"
#include "etl/private/bitset_new.h"
namespace
{
using ull = unsigned long long;
SUITE(test_bitset_new_comparisons)
{
//*************************************************************************
TEST(test_equality_single_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x0123456789012345ULL);
etl::bitset_ext<64, uint64_t>::buffer_type buffer3;
etl::bitset_ext<64, uint64_t>::buffer_type buffer4;
etl::bitset_ext<64, uint64_t> data3(0x0123456789012345ULL, buffer3);
etl::bitset_ext<64, uint64_t> data4(0x0123456789012345ULL, buffer4);
// Double check we are using the single element storage model.
CHECK(etl::bitset_storage_model::Single == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data4.Storage_Model);
CHECK(data1 == data2); // bitset == bitset
CHECK(data1 == data3); // bitset == bitset_ext
CHECK(data3 == data1); // bitset_ext == bitset
CHECK(data3 == data4); // bitset_ext == bitset_ext
}
//*************************************************************************
TEST(test_inequality_single_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x0123456784012345ULL);
etl::bitset_ext<64, uint64_t>::buffer_type buffer3;
etl::bitset_ext<64, uint64_t>::buffer_type buffer4;
etl::bitset_ext<64, uint64_t> data3(0x0123456787012345ULL, buffer3);
etl::bitset_ext<64, uint64_t> data4(0x0123426789012345ULL, buffer4);
// Double check we are using the single element storage model.
CHECK(etl::bitset_storage_model::Single == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data4.Storage_Model);
CHECK(data1 != data2); // bitset != bitset
CHECK(data1 != data3); // bitset != bitset_ext
CHECK(data3 != data1); // bitset_ext != bitset
CHECK(data3 != data4); // bitset_ext != bitset_ext
}
//*************************************************************************
TEST(test_equality_multi_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456789012345ULL);
etl::bitset_ext<64>::buffer_type buffer3;
etl::bitset_ext<64>::buffer_type buffer4;
etl::bitset_ext<64> data3(0x0123456789012345ULL, buffer3);
etl::bitset_ext<64> data4(0x0123456789012345ULL, buffer4);
// Double check we are using the multi element storage model.
CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 == data2); // bitset == bitset
CHECK(data1 == data3); // bitset == bitset_ext
CHECK(data3 == data1); // bitset_ext == bitset
CHECK(data3 == data4); // bitset_ext == bitset_ext
}
//*************************************************************************
TEST(test_inequality_multi_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456784012345ULL);
etl::bitset_ext<64>::buffer_type buffer3;
etl::bitset_ext<64>::buffer_type buffer4;
etl::bitset_ext<64> data3(0x0123456787012345ULL, buffer3);
etl::bitset_ext<64> data4(0x0123426789012345ULL, buffer4);
// Double check we are using the multi element storage model.
CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 != data2); // bitset != bitset
CHECK(data1 != data3); // bitset != bitset_ext
CHECK(data3 != data1); // bitset_ext != bitset
CHECK(data3 != data4); // bitset_ext != bitset_ext
}
//*************************************************************************
TEST(test_equality_mixed_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456789012345ULL);
etl::bitset_ext<64, uint64_t>::buffer_type buffer3;
etl::bitset_ext<64>::buffer_type buffer4;
etl::bitset_ext<64, uint64_t> data3(0x0123456789012345ULL, buffer3);
etl::bitset_ext<64> data4(0x0123456789012345ULL, buffer4);
// Double check we are using the single/multi element storage model.
CHECK(etl::bitset_storage_model::Single == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 == data2); // bitset (S) == bitset (M)
CHECK(data2 == data1); // bitset (M) == bitset (S)
CHECK(data3 == data4); // bitset_ext (S) == bitset_ext (M)
CHECK(data4 == data3); // bitset_ext (M) == bitset_ext (S)
CHECK(data1 == data4); // bitset (S) == bitset_ext (M)
CHECK(data4 == data1); // bitset_ext (M) == bitset (S)
CHECK(data2 == data3); // bitset (M) == bitset_ext (S)
CHECK(data3 == data2); // bitset_ext (S) == bitset (M)
}
//*************************************************************************
TEST(test_inequality_mixed_storage_model)
{
ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456784012345ULL);
etl::bitset_ext<64, uint64_t>::buffer_type buffer3;
etl::bitset_ext<64>::buffer_type buffer4;
etl::bitset_ext<64, uint64_t> data3(0x0123456787012345ULL, buffer3);
etl::bitset_ext<64> data4(0x0123426789012345ULL, buffer4);
// Double check we are using the single/multi element storage model.
CHECK(etl::bitset_storage_model::Single == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Single == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 != data2); // bitset (S) != bitset (M)
CHECK(data2 != data1); // bitset (M) != bitset (S)
CHECK(data3 != data4); // bitset_ext (S) != bitset_ext (M)
CHECK(data4 != data3); // bitset_ext (M) != bitset_ext (S)
CHECK(data1 != data4); // bitset (S) != bitset_ext (M)
CHECK(data4 != data1); // bitset_ext (M) != bitset (S)
CHECK(data2 != data3); // bitset (M) != bitset_ext (S)
CHECK(data3 != data2); // bitset_ext (S) != bitset (M)
}
//*************************************************************************
TEST(test_equality_mixed_storage_model_different_element_types)
{
ETL_CONSTEXPR14 etl::bitset<64, uint32_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64, uint8_t> data2(0x0123456789012345ULL);
etl::bitset_ext<64, uint32_t>::buffer_type buffer3;
etl::bitset_ext<64, uint8_t>::buffer_type buffer4;
etl::bitset_ext<64, uint32_t> data3(0x0123456789012345ULL, buffer3);
etl::bitset_ext<64, uint8_t> data4(0x0123456789012345ULL, buffer4);
// Double check we are using the multi element storage model.
CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 == data2); // bitset (S) == bitset (M)
CHECK(data2 == data1); // bitset (M) == bitset (S)
CHECK(data3 == data4); // bitset_ext (S) == bitset_ext (M)
CHECK(data4 == data3); // bitset_ext (M) == bitset_ext (S)
CHECK(data1 == data4); // bitset (S) == bitset_ext (M)
CHECK(data4 == data1); // bitset_ext (M) == bitset (S)
CHECK(data2 == data3); // bitset (M) == bitset_ext (S)
CHECK(data3 == data2); // bitset_ext (S) == bitset (M)
}
//*************************************************************************
TEST(test_inequality_mixed_storage_model_different_element_types)
{
ETL_CONSTEXPR14 etl::bitset<64, uint32_t> data1(0x0123456789012345ULL);
ETL_CONSTEXPR14 etl::bitset<64, uint8_t> data2(0x0123456784012345ULL);
etl::bitset_ext<64, uint32_t>::buffer_type buffer3;
etl::bitset_ext<64, uint8_t>::buffer_type buffer4;
etl::bitset_ext<64, uint32_t> data3(0x0123456787012345ULL, buffer3);
etl::bitset_ext<64, uint8_t> data4(0x0123426789012345ULL, buffer4);
// Double check we are using the multi element storage model.
CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model);
CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model);
CHECK(data1 != data2); // bitset (S) != bitset (M)
CHECK(data2 != data1); // bitset (M) != bitset (S)
CHECK(data3 != data4); // bitset_ext (S) != bitset_ext (M)
CHECK(data4 != data3); // bitset_ext (M) != bitset_ext (S)
CHECK(data1 != data4); // bitset (S) != bitset_ext (M)
CHECK(data4 != data1); // bitset_ext (M) != bitset (S)
CHECK(data2 != data3); // bitset (M) != bitset_ext (S)
CHECK(data3 != data2); // bitset_ext (S) != bitset (M)
}
};
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -839,17 +839,17 @@
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - Force C++03|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No virtual messages|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
@ -859,37 +859,37 @@
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++ 20 - No Tests|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MSVC C++20 - Optimised O2|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++14|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++17|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++17 - No STL|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No STL|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release MSVC C++20 - No STL - Optimised -O2|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
@ -935,7 +935,7 @@
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++14 - No STL|Win32'">
<LinkIncremental>false</LinkIncremental>
<LinkIncremental>true</LinkIncremental>
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
<IntDir>$(Configuration)\</IntDir>
</PropertyGroup>
@ -7318,6 +7318,7 @@
<ClCompile Include="..\test_atomic.cpp" />
<ClCompile Include="..\test_base64.cpp" />
<ClCompile Include="..\test_bit.cpp" />
<ClCompile Include="..\test_bitset_new_comparisons.cpp" />
<ClCompile Include="..\test_bitset_new_default_element_type.cpp" />
<ClCompile Include="..\test_bitset_new_explicit_single_element_type.cpp" />
<ClCompile Include="..\test_bitset_new_ext_default_element_type.cpp" />

View File

@ -3251,9 +3251,6 @@
<ClCompile Include="..\test_math_functions.cpp">
<Filter>Tests\Maths</Filter>
</ClCompile>
<ClCompile Include="..\syntax_check\math.h.t.cpp">
<Filter>Tests\Maths</Filter>
</ClCompile>
<ClCompile Include="..\test_string_u8.cpp">
<Filter>Tests\Strings</Filter>
</ClCompile>
@ -3290,6 +3287,12 @@
<ClCompile Include="..\test_crc1.cpp">
<Filter>Tests\CRC</Filter>
</ClCompile>
<ClCompile Include="..\test_bitset_new_comparisons.cpp">
<Filter>Tests\Binary</Filter>
</ClCompile>
<ClCompile Include="..\syntax_check\math.h.t.cpp">
<Filter>Tests\Syntax Checks\Source</Filter>
</ClCompile>
<ClCompile Include="..\syntax_check\crc8_j1850.h.t.cpp">
<Filter>Tests\Syntax Checks\Source</Filter>
</ClCompile>