gmp_integer.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 476 行

H
476
字号
// Copyright (c) 1999,2003,2004  Utrecht University (The Netherlands),// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),// and Tel-Aviv University (Israel).  All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $Source: /CVSROOT/CGAL/Packages/_QP_solver/include/CGAL/_QP_solver/gmp_integer.h,v $// $Revision: 1.5 $ $Date: 2004/09/21 06:44:29 $// $Name:  $//// Author(s)     : Sven Schoenherr <sven@inf.ethz.ch>#ifndef GMP_INTEGER_H#define GMP_INTEGER_H// includes#include <gmp.h>#include <iostream>namespace GMP {// Class declaration// =================class Integer;// Function declaration// ====================std::ostream&  operator << ( std::ostream&, const Integer&);// Class interface// ===============class Integer {  public:    // construction    Integer( );    Integer( const Integer&);    Integer( int);    Integer( signed long);    Integer( unsigned long);    Integer( double);    // destruction    ~Integer( );    // assignment    Integer&  operator = ( const Integer&);    // comparisons    bool  operator == ( const Integer&) const;    bool  operator != ( const Integer&) const;    bool  operator <  ( const Integer&) const;    bool  operator >  ( const Integer&) const;    bool  operator <= ( const Integer&) const;    bool  operator >= ( const Integer&) const;    // arithmetic operations    Integer  operator - ( ) const;    Integer  operator + ( const Integer&) const;    Integer  operator - ( const Integer&) const;    Integer  operator * ( const Integer&) const;    Integer  operator / ( const Integer&) const;    // arithmetic assignment operations    Integer&  operator += ( const Integer&);    Integer&  operator -= ( const Integer&);    Integer&  operator *= ( const Integer&);    Integer&  operator /= ( const Integer&);    // shift operations    Integer  operator << ( unsigned long) const;    Integer  operator >> ( unsigned long) const;        // shift assignment operations    Integer&  operator <<= ( unsigned long);    Integer&  operator >>= ( unsigned long);        // sign function    int  sign( ) const;    // conversion functions    long    to_long  ( ) const;    double  to_double( ) const;    // access functions to the internal representation    size_t         length( ) const;    unsigned long  zeros ( ) const;  private:    // data members    mpz_t  value;    // friends    friend  std::ostream&  operator << ( std::ostream&, const Integer&);};// ============================================================================// Class implementation// ====================// construction// ------------// default constructorinlineInteger::Integer( ){    mpz_init( value);}// copy constructorinlineInteger::Integer( const Integer& integer){    mpz_init_set( value, integer.value);}// constructor (int)inlineInteger::Integer( int i){    mpz_init_set_si( value, i);}// constructor (signed long)inlineInteger::Integer( signed long sl){    mpz_init_set_si( value, sl);}// constructor (unsigned long)inlineInteger::Integer( unsigned long ul){    mpz_init_set_ui( value, ul);}// constructor (double)inlineInteger::Integer( double d){    mpz_init_set_d ( value, d);}// destruction// -----------// destructorinlineInteger::~Integer( ){    mpz_clear( value);}// assignment// ----------inlineInteger&Integer::operator = ( const Integer& integer){    mpz_set( value, integer.value);    return *this;}// comparisons// -----------// equalinlineboolInteger::operator == ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) == 0);}// not equalinlineboolInteger::operator != ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) != 0);}// lessinlineboolInteger::operator < ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) < 0);}// greaterinlineboolInteger::operator > ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) > 0);}// less equalinlineboolInteger::operator <= ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) <= 0);}// greater equalinlineboolInteger::operator >= ( const Integer& integer) const{    return ( mpz_cmp( value, integer.value) >= 0);}// arithmetic operations// ---------------------// unary minusinlineIntegerInteger::operator - ( ) const{    Integer  result;    mpz_neg( result.value, value);    return result;}// additioninlineIntegerInteger::operator + ( const Integer& integer) const{    Integer  result;    mpz_add( result.value, value, integer.value);    return result;}// subtractioninlineIntegerInteger::operator - ( const Integer& integer) const{    Integer  result;    mpz_sub( result.value, value, integer.value);    return result;}// multiplicationinlineIntegerInteger::operator * ( const Integer& integer) const{    Integer  result;    mpz_mul( result.value, value, integer.value);    return result;}// division (truncated)inlineIntegerInteger::operator / ( const Integer& integer) const{    Integer  result;    mpz_tdiv_q( result.value, value, integer.value);    return result;}// arithmetic assignment operations// --------------------------------// addition assignmentinlineInteger&Integer::operator += ( const Integer& integer){    mpz_add( value, value, integer.value);    return *this;}// subtraction assignmentinlineInteger&Integer::operator -= ( const Integer& integer){    mpz_sub( value, value, integer.value);    return *this;}// multiplication assignmentinlineInteger&Integer::operator *= ( const Integer& integer){    mpz_mul( value, value, integer.value);    return *this;}// division assignmentinlineInteger&Integer::operator /= ( const Integer& integer){    mpz_tdiv_q( value, value, integer.value);    return *this;}// shift operations// ----------------// left shiftinlineIntegerInteger::operator << ( unsigned long i) const{    Integer  result;    mpz_mul_2exp( result.value, value, i);    return result;}// right shiftinlineIntegerInteger::operator >> ( unsigned long i) const{    Integer  result;    mpz_tdiv_q_2exp( result.value, value, i);    return result;}    // shift assignment operations// ---------------------------// left shift assignmentinlineInteger&Integer::operator <<= ( unsigned long i){    mpz_mul_2exp( value, value, i);    return *this;}// right shift assignmentinlineInteger&Integer::operator >>= ( unsigned long i){    mpz_tdiv_q_2exp( value, value, i);    return *this;}// sign function// -------------inlineintInteger::sign( ) const{    return mpz_sgn( value);}// conversion functions// --------------------// conversion to longinlinelongInteger::to_long( ) const{    return mpz_get_si( value);}// conversion to doubleinlinedoubleInteger::to_double( ) const{    return mpz_get_d( value);}// access functions to the internal representation// -----------------------------------------------// number of bitsinlinesize_tInteger::length( ) const{    return mpz_sizeinbase( value, 2);}// number of trailing zerosinlineunsigned longInteger::zeros ( ) const{    if ( mpz_sgn( value) == 0)	return 0;    else	return mpz_scan1( value, 0);}// I/O// ---// output operatorinlinestd::ostream&operator << ( std::ostream& out, const Integer& integer){    out << mpz_get_str( (char*)0, 10, integer.value);    return out;}} // namespace GMP#endif // GMP_INTEGER_H// ===== EOF ==================================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?