| /******************************************************************************* |
| * Copyright (c) 2016 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Created on: 16 mai 2016 |
| * |
| * Contributors: |
| * Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr |
| * - Initial API and Implementation |
| ******************************************************************************/ |
| |
| #ifndef FML_NUMERIC_BASIC_NUMERICIMPL_H_ |
| #define FML_NUMERIC_BASIC_NUMERICIMPL_H_ |
| |
| #include <fml/numeric/basic/IntegerImpl.h> |
| #include <fml/numeric/basic/RationalImpl.h> |
| #include <fml/numeric/basic/FloatImpl.h> |
| |
| |
| namespace sep |
| { |
| namespace numeric |
| { |
| |
| |
| /** |
| * compare Float |
| * with ... |
| */ |
| inline int compare(const Float & num1, const Float & num2) |
| { |
| return( num1.compare( num2 ) ); |
| } |
| |
| inline int compare(const Float & num1, const Integer & num2) |
| { |
| return( num1.compare( num2 ) ); |
| } |
| |
| inline int compare(const Float & num1, const Rational & num2) |
| { |
| return( num1.compare( Float( num2.toFloat() ) ) ); |
| } |
| |
| |
| /** |
| * compare Rational |
| * with ... |
| */ |
| inline int compare(const Rational & num1, const Rational & num2) |
| { |
| return( num1.compare( num2 ) ); |
| } |
| |
| inline int compare(const Rational & num1, const Integer & num2) |
| { |
| return( num1.compare( num2 ) ); |
| } |
| |
| inline int compare(const Rational & num1, const Float & num2) |
| { |
| return( - compare( num2, num1 ) ); |
| } |
| |
| |
| /** |
| * compare Integer |
| * with ... |
| */ |
| inline int compare(const Integer & num1, const Integer & num2) |
| { |
| return( num1.compare( num2 ) ); |
| } |
| |
| inline int compare(const Integer & num1, const Rational & num2) |
| { |
| return( - compare( num2, num1 ) ); |
| } |
| |
| inline int compare(const Integer & num1, const Float & num2) |
| { |
| return( - compare( num2, num1 ) ); |
| } |
| |
| |
| /** |
| * operator== |
| */ |
| // Integer == Number |
| inline bool operator==(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| inline bool operator==(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| inline bool operator==(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| |
| // Rational == Number |
| inline bool operator==(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| inline bool operator==(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| inline bool operator==(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() == num2.getValue() ); |
| } |
| |
| |
| // Float == Number |
| inline bool operator==(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| inline bool operator==(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() == num2.toFloat() ); |
| } |
| |
| inline bool operator==(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() == num2.getValue() ); |
| } |
| |
| |
| /** |
| * operator!= |
| */ |
| // Integer != Number |
| inline bool operator!=(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| inline bool operator!=(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| inline bool operator!=(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| |
| // Rational != Number |
| inline bool operator!=(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| inline bool operator!=(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| inline bool operator!=(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() != num2.getValue() ); |
| } |
| |
| |
| // Float != Number |
| inline bool operator!=(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| inline bool operator!=(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() != num2.toFloat() ); |
| } |
| |
| inline bool operator!=(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() != num2.getValue() ); |
| } |
| |
| |
| /** |
| * operator< |
| */ |
| // Integer < Number |
| inline bool operator<(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| inline bool operator<(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| inline bool operator<(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| |
| // Rational < Number |
| inline bool operator<(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| inline bool operator<(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| inline bool operator<(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() < num2.getValue() ); |
| } |
| |
| |
| // Float < Number |
| inline bool operator<(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| inline bool operator<(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() < num2.toFloat() ); |
| } |
| |
| inline bool operator<(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() < num2.getValue() ); |
| } |
| |
| /** |
| * operator<= |
| */ |
| // Integer <= Number |
| inline bool operator<=(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| inline bool operator<=(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| inline bool operator<=(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| |
| // Rational <= Number |
| inline bool operator<=(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| inline bool operator<=(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| inline bool operator<=(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() <= num2.getValue() ); |
| } |
| |
| |
| // Float <= Number |
| inline bool operator<=(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| inline bool operator<=(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() <= num2.toFloat() ); |
| } |
| |
| inline bool operator<=(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() <= num2.getValue() ); |
| } |
| |
| |
| /** |
| * operator> |
| */ |
| // Integer > Number |
| inline bool operator>(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| inline bool operator>(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| inline bool operator>(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| |
| // Rational > Number |
| inline bool operator>(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| inline bool operator>(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| inline bool operator>(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() > num2.getValue() ); |
| } |
| |
| |
| // Float > Number |
| inline bool operator>(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| inline bool operator>(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() > num2.toFloat() ); |
| } |
| |
| inline bool operator>(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() > num2.getValue() ); |
| } |
| |
| /** |
| * operator>= |
| */ |
| // Integer >= Number |
| inline bool operator>=(const Integer & num1, const Integer & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| inline bool operator>=(const Integer & num1, const Rational & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| inline bool operator>=(const Integer & num1, const Float & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| |
| // Rational >= Number |
| inline bool operator>=(const Rational & num1, const Rational & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| inline bool operator>=(const Rational & num1, const Integer & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| inline bool operator>=(const Rational & num1, const Float & num2) |
| { |
| return( num1.toFloat() >= num2.getValue() ); |
| } |
| |
| |
| // Float >= Number |
| inline bool operator>=(const Float & num1, const Float & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| inline bool operator>=(const Float & num1, const Rational & num2) |
| { |
| return( num1.getValue() >= num2.toFloat() ); |
| } |
| |
| inline bool operator>=(const Float & num1, const Integer & num2) |
| { |
| return( num1.getValue() >= num2.getValue() ); |
| } |
| |
| |
| /** |
| * operator+ |
| */ |
| // Integer + Number |
| inline Integer operator+(const Integer & num1, const Integer & num2) |
| { |
| return( Integer(num1.getValue() + num2.getValue()) ); |
| } |
| |
| inline Rational operator+(const Integer & num1, const Rational & num2) |
| { |
| return( Rational(Rational(num1).getValue() + num2.getValue()) ); |
| } |
| |
| inline Float operator+(const Integer & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() + num2.getValue()) ); |
| } |
| |
| |
| // Rational + Number |
| inline Rational operator+(const Rational & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() + num2.getValue()) ); |
| } |
| |
| inline Rational operator+(const Rational & num1, const Integer & num2) |
| { |
| return( Rational(num1.getValue() + Rational(num2).getValue()) ); |
| } |
| |
| inline Float operator+(const Rational & num1, const Float & num2) |
| { |
| return( Float(num1.toFloat() + num2.getValue()) ); |
| } |
| |
| |
| // Float + Number |
| inline Float operator+(const Float & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() + num2.getValue()) ); |
| } |
| |
| inline Float operator+(const Float & num1, const Rational & num2) |
| { |
| return( Float(num1.getValue() + num2.toFloat()) ); |
| } |
| |
| inline Float operator+(const Float & num1, const Integer & num2) |
| { |
| return( Float(num1.getValue() + num2.getValue() ) ); |
| } |
| |
| |
| /** |
| * operator- |
| */ |
| inline Integer operator-(const Integer & num) |
| { |
| return( Integer(- num.getValue()) ); |
| } |
| |
| inline Rational operator-(const Rational & num) |
| { |
| return( Rational(- num.getValue()) ); |
| } |
| |
| inline Float operator-(const Float & num) |
| { |
| return( Float(- num.getValue()) ); |
| } |
| |
| |
| /** |
| * operator- |
| */ |
| // Integer - Number |
| inline Integer operator-(const Integer & num1, const Integer & num2) |
| { |
| return( Integer(num1.getValue() - num2.getValue()) ); |
| } |
| |
| inline Rational operator-(const Integer & num1, const Rational & num2) |
| { |
| return( Rational(Rational(num1).getValue() - num2.getValue()) ); |
| } |
| |
| inline Float operator-(const Integer & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() - num2.getValue()) ); |
| } |
| |
| |
| // Rational - Number |
| inline Rational operator-(const Rational & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() - num2.getValue()) ); |
| } |
| |
| inline Rational operator-(const Rational & num1, const Integer & num2) |
| { |
| return( Rational(num1.getValue() - Rational(num2).getValue()) ); |
| } |
| |
| inline Float operator-(const Rational & num1, const Float & num2) |
| { |
| return( Float(num1.toFloat() - num2.getValue()) ); |
| } |
| |
| |
| // Float - Number |
| inline Float operator-(const Float & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() - num2.getValue()) ); |
| } |
| |
| inline Float operator-(const Float & num1, const Rational & num2) |
| { |
| return( Float(num1.getValue() - num2.getValue()) ); |
| } |
| |
| inline Float operator-(const Float & num1, const Integer & num2) |
| { |
| return( Float(num1.getValue() - num2.getValue() ) ); |
| } |
| |
| |
| /** |
| * operator* |
| */ |
| // Integer * Number |
| inline Integer operator*(const Integer & num1, const Integer & num2) |
| { |
| return( Integer(num1.getValue() * num2.getValue()) ); |
| } |
| |
| inline Rational operator*(const Integer & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() * num2.rawNumerator() , |
| num2.rawDenominator()) ); |
| } |
| |
| inline Float operator*(const Integer & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() * num2.getValue()) ); |
| } |
| |
| |
| // Rational * Number |
| inline Rational operator*(const Rational & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() * num2.getValue()) ); |
| } |
| |
| inline Rational operator*(const Rational & num1, const Integer & num2) |
| { |
| return( Rational(num1.rawNumerator() * num2.getValue(), |
| num1.rawDenominator()) ); |
| } |
| |
| inline Float operator*(const Rational & num1, const Float & num2) |
| { |
| return( Float(num1.toFloat() * num2.getValue()) ); |
| } |
| |
| |
| // Float * Number |
| inline Float operator*(const Float & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() * num2.getValue()) ); |
| } |
| |
| inline Float operator*(const Float & num1, const Rational & num2) |
| { |
| return( Float(num1.getValue() * num2.toFloat()) ); |
| } |
| |
| inline Float operator*(const Float & num1, const Integer & num2) |
| { |
| return( Float(num1.getValue() * num2.getValue() ) ); |
| } |
| |
| |
| /** |
| * pow |
| */ |
| inline Integer pow(const Integer & num, avm_uinteger_t anExponent) |
| { |
| return( Integer( num.pow(anExponent) ) ); |
| } |
| |
| inline Rational pow(const Rational & num, avm_uinteger_t anExponent) |
| { |
| Rational result( num ); |
| result.set_pow( anExponent ); |
| |
| return( Rational( result ) ); |
| } |
| |
| inline Float pow(const Float & num, avm_uinteger_t anExponent) |
| { |
| Float result( num ); |
| result.set_pow( anExponent ); |
| |
| return( Float( result ) ); |
| } |
| |
| |
| /** |
| * operator/ |
| */ |
| // Integer / Number |
| inline Rational operator/(const Integer & num1, const Integer & num2) |
| { |
| return( Rational( num1.getValue() , num2.getValue() ) ); |
| } |
| |
| inline Rational operator/(const Integer & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() * num2.rawDenominator() , |
| num2.rawNumerator() ) ); |
| } |
| |
| inline Float operator/(const Integer & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() / num2.getValue()) ); |
| } |
| |
| |
| // Rational / Number |
| inline Rational operator/(const Rational & num1, const Rational & num2) |
| { |
| return( Rational(num1.getValue() / num2.getValue()) ); |
| } |
| |
| inline Rational operator/(const Rational & num1, const Integer & num2) |
| { |
| return( Rational(num1.rawNumerator() , |
| num1.rawDenominator() * num2.getValue()) ); |
| } |
| |
| inline Float operator/(const Rational & num1, const Float & num2) |
| { |
| return( Float(num1.toFloat() / num2.getValue()) ); |
| } |
| |
| // Float / Number |
| inline Float operator/(const Float & num1, const Float & num2) |
| { |
| return( Float(num1.getValue() / num2.getValue()) ); |
| } |
| |
| inline Float operator/(const Float & num1, const Rational & num2) |
| { |
| return( Float(num1.getValue() / num2.toFloat()) ); |
| } |
| |
| inline Float operator/(const Float & num1, const Integer & num2) |
| { |
| return( Float(num1.getValue() / num2.getValue() ) ); |
| } |
| |
| |
| /** |
| * inverse |
| */ |
| inline Rational inverse(const Integer & num) |
| { |
| return( Rational( Integer(1) , num ) ); |
| } |
| |
| inline Rational inverse(const Rational & num) |
| { |
| return( Rational( num.rawDenominator() , num.rawNumerator() ) ); |
| } |
| |
| inline Float inverse(const Float & num) |
| { |
| return( Float( 1 / num.getValue() ) ); |
| } |
| |
| |
| } /* namespace numeric */ |
| } /* namespace sep */ |
| |
| #endif /* FML_NUMERIC_BASIC_NUMERICIMPL_H_ */ |