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; +}