From 01685d67d127dfe19a893ee8ffdbf53376bbc208 Mon Sep 17 00:00:00 2001 From: Thomas Nixon Date: Tue, 16 Jan 2024 12:12:46 +0000 Subject: [PATCH] NamedType: validate in ++ and -- the mess here is to make sure that the new value is valid without changing the old value, to make sure that the value stays valid even when an exception is thrown fixes #192 --- include/adm/detail/named_type.hpp | 10 ++++++++-- tests/named_type_tests.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/adm/detail/named_type.hpp b/include/adm/detail/named_type.hpp index 66384a69..06cb03c0 100644 --- a/include/adm/detail/named_type.hpp +++ b/include/adm/detail/named_type.hpp @@ -112,7 +112,10 @@ namespace adm { } NamedType& operator++() { - ++value_; + T tmp = value_; + tmp++; + Validator::validate(tmp); + value_ = std::move(tmp); return *this; } @@ -123,7 +126,10 @@ namespace adm { } NamedType& operator--() { - --value_; + T tmp = value_; + tmp--; + Validator::validate(tmp); + value_ = std::move(tmp); return *this; } diff --git a/tests/named_type_tests.cpp b/tests/named_type_tests.cpp index 7a14d39d..18bb3482 100644 --- a/tests/named_type_tests.cpp +++ b/tests/named_type_tests.cpp @@ -52,6 +52,16 @@ TEST_CASE("NamedType_range_check") { NamedIntegerRange goodValue(5); REQUIRE_THROWS_AS(NamedIntegerRange(12), OutOfRangeError); REQUIRE_THROWS_AS(NamedIntegerRange(-1), OutOfRangeError); + + NamedIntegerRange lower_limit(0); + REQUIRE_THROWS_AS(lower_limit--, OutOfRangeError); + REQUIRE_THROWS_AS(--lower_limit, OutOfRangeError); + REQUIRE(lower_limit == 0); + + NamedIntegerRange upper_limit(10); + REQUIRE_THROWS_AS(upper_limit++, OutOfRangeError); + REQUIRE_THROWS_AS(++upper_limit, OutOfRangeError); + REQUIRE(upper_limit == 10); } TEST_CASE("screen_edge_validator") {