Some {asset, price} operator cleanup; fix #134

This commit is contained in:
Vikram Rajkumar 2015-07-06 14:17:47 -04:00
parent 715d9a71b3
commit b89ff4e6b1
2 changed files with 48 additions and 44 deletions

View file

@ -20,59 +20,50 @@
#include <boost/rational.hpp> #include <boost/rational.hpp>
namespace graphene { namespace chain { namespace graphene { namespace chain {
bool operator < ( const asset& a, const asset& b )
bool operator == ( const price& a, const price& b )
{ {
return std::tie( a.asset_id, a.amount ) < std::tie( b.asset_id, b.amount); if( std::tie( a.base.asset_id, a.quote.asset_id ) != std::tie( b.base.asset_id, b.quote.asset_id ) )
} return false;
bool operator <= ( const asset& a, const asset& b )
{ const auto amult = fc::uint128( b.quote.amount.value ) * a.base.amount.value;
return std::tie( a.asset_id, a.amount ) <= std::tie( b.asset_id, b.amount); const auto bmult = fc::uint128( a.quote.amount.value ) * b.base.amount.value;
return amult == bmult;
} }
bool operator < ( const price& a, const price& b ) bool operator < ( const price& a, const price& b )
{ {
if( a.base.asset_id < b.base.asset_id ) return true; if( a.base.asset_id < b.base.asset_id ) return true;
if( a.base.asset_id > b.base.asset_id ) return false; if( a.base.asset_id > b.base.asset_id ) return false;
if( a.quote.asset_id < b.quote.asset_id ) return true; if( a.quote.asset_id < b.quote.asset_id ) return true;
if( a.quote.asset_id > b.quote.asset_id ) return false; if( a.quote.asset_id > b.quote.asset_id ) return false;
auto amult = fc::uint128(b.quote.amount.value) * a.base.amount.value;
auto bmult = fc::uint128(a.quote.amount.value) * b.base.amount.value; const auto amult = fc::uint128( b.quote.amount.value ) * a.base.amount.value;
assert( (a.to_real() < b.to_real()) == (amult < bmult) ); const auto bmult = fc::uint128( a.quote.amount.value ) * b.base.amount.value;
return amult < bmult; return amult < bmult;
} }
bool operator <= ( const price& a, const price& b ) bool operator <= ( const price& a, const price& b )
{ {
if( a.base.asset_id < b.base.asset_id ) return true; return (a == b) || (a < b);
if( a.base.asset_id > b.base.asset_id ) return false;
if( a.quote.asset_id < b.quote.asset_id ) return true;
if( a.quote.asset_id > b.quote.asset_id ) return false;
auto amult = fc::uint128(b.quote.amount.value) * a.base.amount.value;
auto bmult = fc::uint128(a.quote.amount.value) * b.base.amount.value;
assert( (a.to_real() <= b.to_real()) == (amult <= bmult) );
return amult <= bmult;
}
bool operator == ( const price& a, const price& b )
{
if( a.base.asset_id < b.base.asset_id ) return true;
if( a.base.asset_id > b.base.asset_id ) return false;
if( a.quote.asset_id < b.quote.asset_id ) return true;
if( a.quote.asset_id > b.quote.asset_id ) return false;
auto amult = fc::uint128(a.quote.amount.value) * b.base.amount.value;
auto bmult = fc::uint128(b.quote.amount.value) * a.base.amount.value;
return amult == bmult;
} }
bool operator != ( const price& a, const price& b ) bool operator != ( const price& a, const price& b )
{ {
return !(a==b); return !(a == b);
}
bool operator > ( const price& a, const price& b )
{
return !(a <= b);
} }
bool operator >= ( const price& a, const price& b ) bool operator >= ( const price& a, const price& b )
{ {
return !(a < b); return !(a < b);
} }
bool operator > ( const price& a, const price& b )
{
return !(a <= b);
}
asset operator * ( const asset& a, const price& b ) asset operator * ( const asset& a, const price& b )
{ {

View file

@ -16,8 +16,8 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#pragma once #pragma once
#include <graphene/chain/types.hpp>
#include <graphene/chain/config.hpp> #include <graphene/chain/config.hpp>
#include <graphene/chain/types.hpp>
namespace graphene { namespace chain { namespace graphene { namespace chain {
@ -42,20 +42,34 @@ namespace graphene { namespace chain {
return *this; return *this;
} }
asset operator -()const { return asset( -amount, asset_id ); } asset operator -()const { return asset( -amount, asset_id ); }
friend bool operator == ( const asset& a, const asset& b ) friend bool operator == ( const asset& a, const asset& b )
{ {
return tie(a.asset_id,a.amount) == tie(b.asset_id,b.amount); return std::tie( a.asset_id, a.amount ) == std::tie( b.asset_id, b.amount );
} }
friend bool operator >= ( const asset& a, const asset& b ) friend bool operator < ( const asset& a, const asset& b )
{ {
FC_ASSERT( a.asset_id == b.asset_id ); FC_ASSERT( a.asset_id == b.asset_id );
return a.amount >= b.amount; return a.amount < b.amount;
}
friend bool operator <= ( const asset& a, const asset& b )
{
return (a == b) || (a < b);
}
friend bool operator != ( const asset& a, const asset& b )
{
return !(a == b);
} }
friend bool operator > ( const asset& a, const asset& b ) friend bool operator > ( const asset& a, const asset& b )
{ {
FC_ASSERT( a.asset_id == b.asset_id ); return !(a <= b);
return a.amount > b.amount;
} }
friend bool operator >= ( const asset& a, const asset& b )
{
return !(a < b);
}
friend asset operator - ( const asset& a, const asset& b ) friend asset operator - ( const asset& a, const asset& b )
{ {
FC_ASSERT( a.asset_id == b.asset_id ); FC_ASSERT( a.asset_id == b.asset_id );
@ -66,7 +80,6 @@ namespace graphene { namespace chain {
FC_ASSERT( a.asset_id == b.asset_id ); FC_ASSERT( a.asset_id == b.asset_id );
return asset( a.amount + b.amount, a.asset_id ); return asset( a.amount + b.amount, a.asset_id );
} }
}; };
/** /**