@@ -168,6 +168,19 @@ namespace tao
168168 return lhs == rhs;
169169 }
170170
171+ template < template < typename ... > class Traits , typename Base, typename T >
172+ bool operator ==( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
173+ {
174+ static_assert ( noexcept ( Traits< tao::optional< T > >::equal ( lhs, rhs ) ), " equal must be noexcept" );
175+ return Traits< tao::optional< T > >::equal ( lhs, rhs );
176+ }
177+
178+ template < typename T, template < typename ... > class Traits , typename Base >
179+ bool operator ==( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
180+ {
181+ return rhs == lhs;
182+ }
183+
171184 template < template < typename ... > class Traits , typename Base, typename T, typename = decltype ( Traits< typename std::decay< T >::type >::equal( std::declval< const basic_value< Traits, Base >& >(), std::declval< const T& >() ) ) >
172185 bool operator ==( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
173186 {
@@ -179,9 +192,7 @@ namespace tao
179192 template < typename T, template < typename ... > class Traits , typename Base, typename = decltype ( Traits< typename std::decay< T >::type >::equal( std::declval< const basic_value< Traits, Base >& >(), std::declval< const T& >() ) ) >
180193 bool operator ==( const T& lhs, const basic_value< Traits, Base >& rhs ) noexcept
181194 {
182- using D = typename std::decay< T >::type;
183- static_assert ( noexcept ( Traits< D >::equal ( rhs, lhs ) ), " equal must be noexcept" );
184- return Traits< D >::equal ( rhs, lhs );
195+ return rhs == lhs;
185196 }
186197
187198 template < template < typename ... > class TraitsL , typename BaseL, template < typename ... > class TraitsR , typename BaseR >
@@ -190,6 +201,18 @@ namespace tao
190201 return !( lhs == rhs );
191202 }
192203
204+ template < template < typename ... > class Traits , typename Base, typename T >
205+ bool operator !=( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
206+ {
207+ return !( lhs == rhs );
208+ }
209+
210+ template < typename T, template < typename ... > class Traits , typename Base >
211+ bool operator !=( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
212+ {
213+ return !( rhs == lhs );
214+ }
215+
193216 template < template < typename ... > class Traits , typename Base, typename T >
194217 bool operator !=( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
195218 {
@@ -360,6 +383,20 @@ namespace tao
360383 return lhs < rhs;
361384 }
362385
386+ template < template < typename ... > class Traits , typename Base, typename T >
387+ bool operator <( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
388+ {
389+ static_assert ( noexcept ( Traits< tao::optional< T > >::less_than ( lhs, rhs ) ), " less_than must be noexcept" );
390+ return Traits< tao::optional< T > >::less_than ( lhs, rhs );
391+ }
392+
393+ template < typename T, template < typename ... > class Traits , typename Base >
394+ bool operator <( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
395+ {
396+ static_assert ( noexcept ( Traits< tao::optional< T > >::greater_than ( rhs, lhs ) ), " greater_than must be noexcept" );
397+ return Traits< tao::optional< T > >::greater_than ( rhs, lhs );
398+ }
399+
363400 template < template < typename ... > class Traits , typename Base, typename T, typename = decltype ( Traits< typename std::decay< T >::type >::less_than( std::declval< const basic_value< Traits, Base >& >(), std::declval< const T& >() ) ) >
364401 bool operator <( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
365402 {
@@ -372,7 +409,7 @@ namespace tao
372409 bool operator <( const T& lhs, const basic_value< Traits, Base >& rhs ) noexcept
373410 {
374411 using D = typename std::decay< T >::type;
375- static_assert ( noexcept ( Traits< D >::greater_than ( rhs, lhs ) ), " less_than must be noexcept" );
412+ static_assert ( noexcept ( Traits< D >::greater_than ( rhs, lhs ) ), " greater_than must be noexcept" );
376413 return Traits< D >::greater_than ( rhs, lhs );
377414 }
378415
@@ -394,11 +431,25 @@ namespace tao
394431 return rhs < lhs;
395432 }
396433
434+ template < template < typename ... > class Traits , typename Base, typename T >
435+ bool operator >( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
436+ {
437+ static_assert ( noexcept ( Traits< tao::optional< T > >::greater_than ( lhs, rhs ) ), " greater_than must be noexcept" );
438+ return Traits< tao::optional< T > >::greater_than ( lhs, rhs );
439+ }
440+
441+ template < typename T, template < typename ... > class Traits , typename Base >
442+ bool operator >( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
443+ {
444+ static_assert ( noexcept ( Traits< tao::optional< T > >::less_than ( rhs, lhs ) ), " less_than must be noexcept" );
445+ return Traits< tao::optional< T > >::less_than ( rhs, lhs );
446+ }
447+
397448 template < template < typename ... > class Traits , typename Base, typename T, typename = decltype ( Traits< typename std::decay< T >::type >::greater_than( std::declval< const basic_value< Traits, Base >& >(), std::declval< const T& >() ) ) >
398449 bool operator >( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
399450 {
400451 using D = typename std::decay< T >::type;
401- static_assert ( noexcept ( Traits< D >::greater_than ( lhs, rhs ) ), " less_than must be noexcept" );
452+ static_assert ( noexcept ( Traits< D >::greater_than ( lhs, rhs ) ), " greater_than must be noexcept" );
402453 return Traits< D >::greater_than ( lhs, rhs );
403454 }
404455
@@ -416,6 +467,18 @@ namespace tao
416467 return !( lhs > rhs );
417468 }
418469
470+ template < template < typename ... > class Traits , typename Base, typename T >
471+ bool operator <=( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
472+ {
473+ return !( lhs > rhs );
474+ }
475+
476+ template < typename T, template < typename ... > class Traits , typename Base >
477+ bool operator <=( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
478+ {
479+ return !( lhs > rhs );
480+ }
481+
419482 template < template < typename ... > class Traits , typename Base, typename T >
420483 bool operator <=( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
421484 {
@@ -434,6 +497,18 @@ namespace tao
434497 return !( lhs < rhs );
435498 }
436499
500+ template < template < typename ... > class Traits , typename Base, typename T >
501+ bool operator >=( const basic_value< Traits, Base >& lhs, const tao::optional< T >& rhs ) noexcept
502+ {
503+ return !( lhs < rhs );
504+ }
505+
506+ template < typename T, template < typename ... > class Traits , typename Base >
507+ bool operator >=( const tao::optional< T >& lhs, const basic_value< Traits, Base >& rhs ) noexcept
508+ {
509+ return !( lhs < rhs );
510+ }
511+
437512 template < template < typename ... > class Traits , typename Base, typename T >
438513 bool operator >=( const basic_value< Traits, Base >& lhs, const T& rhs ) noexcept
439514 {
0 commit comments