From c6876f65d17d05b943dd53bc46e4bc0548769c57 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 28 Sep 2017 11:11:49 +0100 Subject: [PATCH] Added a compare template that defines <=, >, >= in terms of std::less or a user supplied comparison class. --- src/compare.h | 80 ++++++++++++++++++++++++++++ test/test_compare.cpp | 118 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 src/compare.h create mode 100644 test/test_compare.cpp diff --git a/src/compare.h b/src/compare.h new file mode 100644 index 00000000..4ead719c --- /dev/null +++ b/src/compare.h @@ -0,0 +1,80 @@ +///\file + +/****************************************************************************** +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_COMPARE__ +#define __ETL_COMPARE__ + +#include + +#include "platform.h" +#include "parameter_type.h" + +//***************************************************************************** +///\defgroup compare compare +/// Comparisons only using less than operator +///\ingroup utilities +//***************************************************************************** + +namespace etl +{ + //*************************************************************************** + /// Defines <, <=, >, >= interms of < + /// Default + //*************************************************************************** + template > + struct compare + { + typedef typename etl::parameter_type::type first_argument_type; + typedef typename etl::parameter_type::type second_argument_type; + typedef bool result_type; + + static result_type lt(first_argument_type lhs, second_argument_type rhs) + { + return TLess()(lhs, rhs); + } + + static result_type gt(first_argument_type lhs, second_argument_type rhs) + { + return TLess()(rhs, lhs); + } + + static result_type lte(first_argument_type lhs, second_argument_type rhs) + { + return !gt(lhs, rhs); + } + + static result_type gte(first_argument_type lhs, second_argument_type rhs) + { + return !lt(lhs, rhs); + } + }; +} + +#endif diff --git a/test/test_compare.cpp b/test/test_compare.cpp new file mode 100644 index 00000000..eedd7823 --- /dev/null +++ b/test/test_compare.cpp @@ -0,0 +1,118 @@ +/****************************************************************************** +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. +******************************************************************************/ + +#include "UnitTest++.h" + +#include "compare.h" + +namespace +{ + int a = 1; + int b = 2; + + typedef etl::compare CompareInt; + + struct Test + { + int a; + int b; + }; + + Test ta = { 1, 2 }; + Test tb = { 2, 3 }; + + //*********************************** + bool operator <(const Test& lhs, const Test& rhs) + { + return (lhs.a + lhs.b) < (rhs.a + rhs.b); + } + + //*********************************** + bool operator >(const Test& lhs, const Test& rhs) + { + return (lhs.a + lhs.b) > (rhs.a + rhs.b); + } + + //*********************************** + bool operator <=(const Test& lhs, const Test& rhs) + { + return (lhs.a + lhs.b) <= (rhs.a + rhs.b); + } + + //*********************************** + bool operator >=(const Test& lhs, const Test& rhs) + { + return (lhs.a + lhs.b) >= (rhs.a + rhs.b); + } + + //*********************************** + struct LessTest + { + bool operator()(const Test& lhs, const Test& rhs) const + { + return (lhs.a + lhs.b) < (rhs.a + rhs.b); + } + }; + + typedef etl::compare CompareTest; + + SUITE(test_compare) + { + //************************************************************************* + TEST(test_lt) + { + CHECK_EQUAL(a < b, (CompareInt::lt(a, b))); + CHECK_EQUAL(ta < tb, (CompareTest::lt(ta, tb))); + } + + //************************************************************************* + TEST(test_lte) + { + CHECK_EQUAL(a <= b, (CompareInt::lte(a, b))); + CHECK_EQUAL(a <= a, (CompareInt::lte(a, a))); + CHECK_EQUAL(ta <= tb, (CompareTest::lte(ta, tb))); + CHECK_EQUAL(ta <= ta, (CompareTest::lte(ta, ta))); + } + + //************************************************************************* + TEST(test_gt) + { + CHECK_EQUAL(a > b, (CompareInt::gt(a, b))); + CHECK_EQUAL(ta > tb, (CompareTest::gt(ta, tb))); + } + + //************************************************************************* + TEST(test_gte) + { + CHECK_EQUAL(a >= b, (CompareInt::gte(a, b))); + CHECK_EQUAL(a >= a, (CompareInt::gte(a, a))); + CHECK_EQUAL(ta >= tb, (CompareTest::gte(ta, tb))); + CHECK_EQUAL(ta >= ta, (CompareTest::gte(ta, ta))); + } + }; +}