namespace interval
{
namespace detail
{
template < typename T >
struct result_
{
protected:
const bool value;
const T &item_;
result_( bool p, const T &itm )
: value( p ), item_( itm ) {}
explicit
operator bool( void ) const
{ return this->value; }
};
template < typename T >
struct is_lt_or_leq
: private result_< T >
{
template < typename U >
bool
friend operator>( is_lt_or_leq< U > &&, const U & );
template < typename U >
bool
friend operator>=( is_lt_or_leq< U > &&, const U & );
is_lt_or_leq( bool p, const T &itm )
: result_< T >( p, itm ) {}
using result_< T >::operator bool;
};
template < typename T >
struct is_gt_or_geq
: private result_< T >
{
template < typename U >
bool
friend operator<( is_gt_or_geq< U > &&, const U & );
template < typename U >
bool
friend operator<=( is_gt_or_geq< U > &&, const U & );
is_gt_or_geq( bool p, const T &itm )
: result_< T >( p, itm ) {}
using result_< T >::operator bool;
};
template < typename T >
struct interval_item
{
template < typename U >
bool
friend operator>( interval_item< U > &&, const U & );
template < typename U >
is_lt_or_leq< U >
friend operator>( const U &, interval_item< U > && );
template < typename U >
bool
friend operator>=( interval_item< U > &&, const U & );
template < typename U >
is_lt_or_leq< U >
friend operator>=( const U &, interval_item< U > && );
template < typename U >
bool
friend operator<( interval_item< U > &&, const U & );
template < typename U >
is_gt_or_geq< U >
friend operator<( const U &, interval_item< U > && );
template < typename U >
bool
friend operator<=( interval_item< U > &&, const U & );
template < typename U >
is_gt_or_geq< U >
friend operator<=( const U &, interval_item< U > && );
private:
const T &item_;
public:
interval_item( const T &itm )
: item_( itm ) {}
interval_item( const interval_item & );
interval_item( interval_item && );
interval_item &
operator=( const interval_item & );
interval_item &
operator=( interval_item && );
};
template < typename T >
interval_item< T >
item( const T &itm )
{ return { itm }; }
template < typename T >
bool
operator>( interval_item< T > &&item, const T &x )
{ return item.item_ > x; }
template < typename T >
is_lt_or_leq< T >
operator>( const T &x, interval_item< T > &&item )
{ return { x > item.item_, item.item_ }; }
template < typename T >
bool
operator>( is_lt_or_leq< T > &&prev, const T &x )
{ return prev.value && prev.item_ > x; }
template < typename T >
bool
operator>=( interval_item< T > &&item, const T &x )
{ return item.item_ >= x; }
template < typename T >
is_lt_or_leq< T >
operator>=( const T &x, interval_item< T > &&item )
{ return { x >= item.item_, item.item_ }; }
template < typename T >
bool
operator>=( is_lt_or_leq< T > &&prev, const T &x )
{ return prev.value && prev.item_ >= x; }
template < typename T >
bool
operator<( interval_item< T > &&item, const T &x )
{ return item.item_ < x; }
template < typename T >
is_gt_or_geq< T >
operator<( const T &x, interval_item< T > &&item )
{ return { x < item.item_, item.item_ }; }
template < typename T >
bool
operator<( is_gt_or_geq< T > &&prev, const T &x )
{ return prev.value && prev.item_ < x; }
template < typename T >
bool
operator<=( interval_item< T > &&item, const T &x )
{ return item.item_ <= x; }
template < typename T >
is_gt_or_geq< T >
operator<=( const T &x, interval_item< T > &&item )
{ return { x <= item.item_, item.item_ }; }
template < typename T >
bool
operator<=( is_gt_or_geq< T > &&prev, const T &x )
{ return prev.value && prev.item_ <= x; }
} // namespace detail
using ::interval::detail::item;
} // namespace interval
#include <iostream>
using namespace std;
int
main( void )
{
cout << boolalpha
<< static_cast< bool >( -1 < interval::item( 0 ) < 1 )
<< endl;
}