// ========================================================== // Helper class for rational numbers // // Design and implementation by // - Hervé Drolon // // This file is part of FreeImage 3 // // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER // THIS DISCLAIMER. // // Use at your own risk! // ========================================================== #ifndef FIRATIONAL_H #define FIRATIONAL_H /** Helper class to deal with rational numbers. NB: LONG data type is assumed to be a signed 32-bit number. */ class FIRational { private: /// numerator LONG _numerator; /// denominator LONG _denominator; public: /// Default constructor FIRational(); /// Constructor with longs FIRational(LONG n, LONG d = 1); /// Constructor with FITAG FIRational(const FITAG *tag); /// Constructor with a float FIRational(float value); /// Copy constructor FIRational (const FIRational& r); /// Destructor ~FIRational(); /// Assignement operator FIRational& operator=(FIRational& r); /// Get the numerator LONG getNumerator(); /// Get the denominator LONG getDenominator(); /// Converts rational value by truncating towards zero LONG truncate() { // Return truncated rational return _denominator ? (LONG) (_numerator / _denominator) : 0; } /**@name Implicit conversions */ //@{ short shortValue() { return (short)truncate(); } int intValue() { return (int)truncate(); } LONG longValue() { return (LONG)truncate(); } float floatValue() { return _denominator ? ((float)_numerator)/((float)_denominator) : 0; } double doubleValue() { return _denominator ? ((double)_numerator)/((double)_denominator) : 0; } //@} /// Checks if this rational number is an integer, either positive or negative BOOL isInteger(); /// Convert as "numerator/denominator" std::string toString(); private: /// Initialize and normalize a rational number void initialize(LONG n, LONG d); /// Calculate GCD LONG gcd(LONG a, LONG b); /// Normalize numerator / denominator void normalize(); }; #endif // FIRATIONAL_H