From 0d87890ed83e83c1436ab8ba4112884c95e2df57 Mon Sep 17 00:00:00 2001 From: Oliver Lee Date: Sun, 29 Sep 2024 13:51:32 -0700 Subject: [PATCH] replace `detail::disjoint_subset` with `set_difference` Change-Id: I0580efc61146d808ccf94edb283d95398a17a624 --- rigid_geometric_algebra/BUILD.bazel | 1 - .../blade_complement_type.hpp | 31 ++++++---- .../detail/disjoint_subset.hpp | 57 ------------------- test/blade_type_from_test.cpp | 4 +- test/detail/BUILD.bazel | 10 ---- test/detail/disjoint_subset_test.cpp | 27 --------- 6 files changed, 21 insertions(+), 109 deletions(-) delete mode 100644 rigid_geometric_algebra/detail/disjoint_subset.hpp delete mode 100644 test/detail/disjoint_subset_test.cpp diff --git a/rigid_geometric_algebra/BUILD.bazel b/rigid_geometric_algebra/BUILD.bazel index f697c69..4ff91ca 100644 --- a/rigid_geometric_algebra/BUILD.bazel +++ b/rigid_geometric_algebra/BUILD.bazel @@ -29,7 +29,6 @@ cc_library( "detail/derive_subtraction.hpp", "detail/derive_vector_space_operations.hpp", "detail/derive_zero_constant_overload.hpp", - "detail/disjoint_subset.hpp", "detail/even.hpp", "detail/has_type.hpp", "detail/has_value.hpp", diff --git a/rigid_geometric_algebra/blade_complement_type.hpp b/rigid_geometric_algebra/blade_complement_type.hpp index 58f9976..8dfa6b3 100644 --- a/rigid_geometric_algebra/blade_complement_type.hpp +++ b/rigid_geometric_algebra/blade_complement_type.hpp @@ -1,12 +1,16 @@ #pragma once +#include "rigid_geometric_algebra/algebra_dimension.hpp" +#include "rigid_geometric_algebra/algebra_type.hpp" #include "rigid_geometric_algebra/blade_type_from.hpp" -#include "rigid_geometric_algebra/detail/disjoint_subset.hpp" +#include "rigid_geometric_algebra/canonical_type.hpp" #include "rigid_geometric_algebra/is_blade.hpp" +#include +#include #include +#include #include -#include namespace rigid_geometric_algebra { namespace detail { @@ -15,18 +19,21 @@ template struct blade_complement_type_ {}; -template < - template class blade_, - class A, - std::size_t... Is> -struct blade_complement_type_> +template +struct blade_complement_type_ { - static constexpr auto complement_dimensions = - [](std::index_sequence) { - return detail::disjoint_subset(Is..., Js...); - }(std::make_index_sequence>{}); + using A = algebra_type_t; - using type = blade_type_from_dimensions_t; + using type = blade_type_from_dimensions_t - B::grade>{}; + + std::ranges::set_difference( + std::views::iota(0UZ, algebra_dimension_v), + canonical_type_t::dimensions, + missing.begin()); + + return missing; + }()>; }; } // namespace detail diff --git a/rigid_geometric_algebra/detail/disjoint_subset.hpp b/rigid_geometric_algebra/detail/disjoint_subset.hpp deleted file mode 100644 index 281aceb..0000000 --- a/rigid_geometric_algebra/detail/disjoint_subset.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include "rigid_geometric_algebra/detail/array_subset.hpp" -#include "rigid_geometric_algebra/detail/has_type.hpp" - -#include -#include -#include -#include -#include -#include - -namespace rigid_geometric_algebra::detail { - -/// returns the disjoint subset of values -/// @param is variadic sequence of values -/// -/// Returns the disjoint values (values that only appear once) in an -/// unspecified random access container. Return values are sorted. -/// -inline constexpr class -{ -public: - static constexpr auto operator()() -> std::ranges::empty_view - { - return {}; - } - - template - requires detail::has_type_v> - static constexpr auto - operator()(Ts... is) -> array_subset, sizeof...(Ts)> - { - auto dims = std::array, sizeof...(is)>{is...}; - std::ranges::sort(dims); - - auto pending = std::ranges::subrange(dims); - while (pending) { - using U = decltype(pending.size()); - if (pending.size() == U{1} or pending[0] != pending[1]) { - pending.advance(1); - continue; - } - - const auto next = std::ranges::find_if( - pending, - std::bind_front(std::ranges::not_equal_to{}, std::cref(pending[0]))); - const auto [last, _] = std::ranges::rotate(pending, next); - pending = {pending.begin(), last}; - } - - return {dims.begin(), pending.begin()}; - } - -} disjoint_subset{}; - -} // namespace rigid_geometric_algebra::detail diff --git a/test/blade_type_from_test.cpp b/test/blade_type_from_test.cpp index 607486a..5dffd1b 100644 --- a/test/blade_type_from_test.cpp +++ b/test/blade_type_from_test.cpp @@ -58,7 +58,7 @@ auto main() -> int same, blade_type_from_dimensions_t>() and same, blade_type_from_dimensions_t>() and same, blade_type_from_dimensions_t>() and - same, blade_type_from_dimensions_t>() - ); + same, + blade_type_from_dimensions_t>()); }; } diff --git a/test/detail/BUILD.bazel b/test/detail/BUILD.bazel index 525a3d1..b10641f 100644 --- a/test/detail/BUILD.bazel +++ b/test/detail/BUILD.bazel @@ -75,16 +75,6 @@ cc_test( ], ) -cc_test( - name = "disjoint_subset_test", - size = "small", - srcs = ["disjoint_subset_test.cpp"], - deps = [ - "//rigid_geometric_algebra", - "@skytest", - ], -) - cc_test( name = "has_type_test", size = "small", diff --git a/test/detail/disjoint_subset_test.cpp b/test/detail/disjoint_subset_test.cpp deleted file mode 100644 index 4cda287..0000000 --- a/test/detail/disjoint_subset_test.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "rigid_geometric_algebra/detail/disjoint_subset.hpp" -#include "skytest/skytest.hpp" - -#include -#include -#include - -auto main() -> int -{ - using namespace skytest::literals; - using ::rigid_geometric_algebra::detail::disjoint_subset; - using ::skytest::eq; - using ::skytest::expect; - using ::skytest::pred; - - static constexpr auto equal = pred(std::ranges::equal); - - "disjoint subset"_test = [] { - return expect( - equal(std::views::empty, disjoint_subset()) and - equal(std::array{1}, disjoint_subset(1)) and - equal(std::array{1, 2, 3}, disjoint_subset(1, 2, 3)) and - equal(std::array{1, 2}, disjoint_subset(1, 2, 3, 3)) and - equal(std::array{2}, disjoint_subset(1, 2, 1, 3, 3)) and - equal(std::array{}, disjoint_subset(3, 2, 1, 3, 2, 1))); - }; -}