From 81cc65c854dbdfd0f39ba8891730d91a4c24ece7 Mon Sep 17 00:00:00 2001 From: Oliver Lee Date: Sun, 29 Sep 2024 14:23:12 -0700 Subject: [PATCH] replace use of `assert` macro (#83) Change-Id: I97edf879e46911507e93c35060fdf8d01afe29c4 --- .clang-tidy | 3 -- rigid_geometric_algebra/blade_type_from.hpp | 6 +-- .../detail/array_subset.hpp | 5 ++- rigid_geometric_algebra/detail/contract.hpp | 40 +++++++++++++++++++ .../detail/disjoint_subset.hpp | 1 - .../detail/structural_bitset.hpp | 1 - .../detail/swaps_to_sorted_dimensions.hpp | 1 - test/complement_test.cpp | 2 + .../define_prioritized_overload_test.cpp | 1 - 9 files changed, 48 insertions(+), 12 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index b518756..a83d8de 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -13,9 +13,6 @@ Checks: > # Bazel does this for determinism, -clang-diagnostic-builtin-macro-redefined, - # suppress due to assert, - -cppcoreguidelines-pro-bounds-array-to-pointer-decay, - # short names are fine for short lifetimes, -readability-identifier-length, diff --git a/rigid_geometric_algebra/blade_type_from.hpp b/rigid_geometric_algebra/blade_type_from.hpp index fcd40bf..6a70b56 100644 --- a/rigid_geometric_algebra/blade_type_from.hpp +++ b/rigid_geometric_algebra/blade_type_from.hpp @@ -3,9 +3,9 @@ #include "rigid_geometric_algebra/algebra_type.hpp" #include "rigid_geometric_algebra/blade.hpp" #include "rigid_geometric_algebra/blade_ordering.hpp" +#include "rigid_geometric_algebra/detail/contract.hpp" #include -#include #include #include @@ -30,12 +30,12 @@ struct blade_type_from for (auto index = 0UZ; index != mask.size(); ++index) { if (mask.test(index)) { - assert(it != dims.end()); + detail::invariant(it != dims.end()); *it++ = index; } } - assert(it == dims.end()); + detail::postcondition(it == dims.end()); return dims; }(); diff --git a/rigid_geometric_algebra/detail/array_subset.hpp b/rigid_geometric_algebra/detail/array_subset.hpp index 274454e..f5a4223 100644 --- a/rigid_geometric_algebra/detail/array_subset.hpp +++ b/rigid_geometric_algebra/detail/array_subset.hpp @@ -1,7 +1,8 @@ #pragma once +#include "rigid_geometric_algebra/detail/contract.hpp" + #include -#include #include #include @@ -26,7 +27,7 @@ class array_subset constexpr array_subset(const base_type& base, std::size_t size) : base_{base}, size_{size} { - assert(size_ <= Capacity); + detail::precondition(size_ <= Capacity); } constexpr auto begin() const noexcept { return base_.begin(); } diff --git a/rigid_geometric_algebra/detail/contract.hpp b/rigid_geometric_algebra/detail/contract.hpp index 7506959..a7793d6 100644 --- a/rigid_geometric_algebra/detail/contract.hpp +++ b/rigid_geometric_algebra/detail/contract.hpp @@ -24,6 +24,12 @@ struct precondition_contract explicit precondition_contract() = default; }; +struct invariant_contract +{ + static constexpr auto name = "INVARIANT"; + explicit invariant_contract() = default; +}; + struct postcondition_contract { static constexpr auto name = "POSTCONDITION"; @@ -137,6 +143,40 @@ constexpr auto precondition( /// @} +/// check an invariant, optionally printing a message on failure +/// @param cond boolean-convertible value +/// @param violation_handler handler to invoke on contract violation. +/// @param sl source location +/// +/// Check invariant `cond`. If `false`, invoke `handler(sl)`. +/// +/// @{ + +template + requires std::is_invocable_v< + const Handler&, + invariant_contract, + const std::source_location&> +constexpr auto invariant( + const std::convertible_to auto& cond, + const Handler& violation_handler, + const std::source_location& sl = std::source_location::current()) -> void +{ + if (cond) { + return; + } + + violation_handler(invariant_contract{}, sl); +} + +constexpr auto invariant( + const std::convertible_to auto& cond, + std::format_string<> message = "", // NOLINT(misc-include-cleaner) + const std::source_location& sl = std::source_location::current()) -> void +{ + return invariant(cond, contract_violation_handler{message}, sl); +} + /// check a postcondition, optionally printing a message on failure /// @param cond boolean-convertible value /// @param violation_handler handler to invoke on contract violation. diff --git a/rigid_geometric_algebra/detail/disjoint_subset.hpp b/rigid_geometric_algebra/detail/disjoint_subset.hpp index b0baf70..b85ce01 100644 --- a/rigid_geometric_algebra/detail/disjoint_subset.hpp +++ b/rigid_geometric_algebra/detail/disjoint_subset.hpp @@ -5,7 +5,6 @@ #include #include -#include #include #include #include diff --git a/rigid_geometric_algebra/detail/structural_bitset.hpp b/rigid_geometric_algebra/detail/structural_bitset.hpp index 4ab4ca6..d6d991e 100644 --- a/rigid_geometric_algebra/detail/structural_bitset.hpp +++ b/rigid_geometric_algebra/detail/structural_bitset.hpp @@ -3,7 +3,6 @@ #include "rigid_geometric_algebra/detail/contract.hpp" #include -#include #include #include #include diff --git a/rigid_geometric_algebra/detail/swaps_to_sorted_dimensions.hpp b/rigid_geometric_algebra/detail/swaps_to_sorted_dimensions.hpp index 0dc4071..f68c94c 100644 --- a/rigid_geometric_algebra/detail/swaps_to_sorted_dimensions.hpp +++ b/rigid_geometric_algebra/detail/swaps_to_sorted_dimensions.hpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include diff --git a/test/complement_test.cpp b/test/complement_test.cpp index 880faa3..ec46e65 100644 --- a/test/complement_test.cpp +++ b/test/complement_test.cpp @@ -87,6 +87,8 @@ auto main() -> int using ::SymEngine::Expression; const auto abs = [](T&& arg) -> Expression { + // string literal decays to pointer + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay) return {::SymEngine::abs(Expression{std::forward(arg)})}; }; diff --git a/test/detail/define_prioritized_overload_test.cpp b/test/detail/define_prioritized_overload_test.cpp index df4e476..9ecd8b5 100644 --- a/test/detail/define_prioritized_overload_test.cpp +++ b/test/detail/define_prioritized_overload_test.cpp @@ -6,7 +6,6 @@ #include "rigid_geometric_algebra/detail/priority_list.hpp" #include "skytest/skytest.hpp" -#include #include #include #include