From 23c71c8d279e312ba30057f27b953b82e93eff6d Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Sun, 22 Oct 2023 05:15:43 -0400 Subject: [PATCH] Auto-generation of comparisons as a capability. --- IOStreams/IStreamable.test/0.cc | 5 +++-- auto_comparable.h | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 auto_comparable.h diff --git a/IOStreams/IStreamable.test/0.cc b/IOStreams/IStreamable.test/0.cc index 8b4537a..440486a 100644 --- a/IOStreams/IStreamable.test/0.cc +++ b/IOStreams/IStreamable.test/0.cc @@ -7,16 +7,17 @@ static_assert( __cplusplus > 2020'00 ); #include +#include + namespace { - template< typename= Alepha::Capabilities< Alepha::IOStreams::IStreamable > > + template< typename= Alepha::Capabilities< Alepha::auto_comparable, Alepha::IOStreams::IStreamable > > struct Agg_core { int x; int y; int z; - friend bool operator == ( const Agg_core &lhs, const Agg_core &rhs )= default; friend std::ostream & operator << ( std::ostream &os, const Agg_core &agg ) { diff --git a/auto_comparable.h b/auto_comparable.h new file mode 100644 index 0000000..42bc821 --- /dev/null +++ b/auto_comparable.h @@ -0,0 +1,35 @@ +static_assert( __cplusplus > 2020'00 ); + +#pragma once + +#include + +#include +#include + +#include + +namespace Alepha::Hydrogen ::detail:: auto_comparable_module +{ + inline namespace exports + { + struct auto_comparable : comparable {}; + } + + template< typename T > + concept AutoComparableAggregate= + Capability< T, auto_comparable > + and + Aggregate< T >; + + constexpr decltype( auto ) + equality_lens( const AutoComparableAggregate auto &item ) noexcept + { + return detail::comparisons::magma_hook{ Reflection::tuplizeAggregate( item ) }; + } +} + +namespace Alepha::Hydrogen::inline exports::inline auto_comparable_module +{ + using namespace detail::auto_comparable_module::exports; +}