/*
 *  Open BEAGLE
 *  Copyright (C) 2001-2004 by Christian Gagne and Marc Parizeau
 *
 *  This library is free software; 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; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact:
 *  Laboratoire de Vision et Systemes Numeriques
 *  Departement de genie electrique et de genie informatique
 *  Universite Laval, Quebec, Canada, G1V 4J7
 *  http://vision.gel.ulaval.ca
 *
 */

/*!
 *  \file   beagle/UInt.hpp
 *  \brief  Definition of the type UInt and related operators.
 *  \author Christian Gagne
 *  \author Marc Parizeau
 *  $Revision: 1.2 $
 *  $Date: 2004/01/15 21:08:57 $
 */

#ifndef Beagle_UInt_hpp
#define Beagle_UInt_hpp

#include "beagle/config.hpp"
#include "beagle/macros.hpp"
#include "beagle/WrapperT.hpp"


namespace Beagle {

/*!
 *  \brief Beagle wrapper of the atomic unsigned int type.
 *  \ingroup Adapt
 */
typedef WrapperT< unsigned int >
        UInt;

}


/*!
 *  \brief  Test whether an unsigned int is less than another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is less than the right one, false if not.
 *  \par Note:
 *    The operator is defined relatively to the function isLess of Beagle::UInt.
 */
inline bool operator<(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.isLess(inRightUInt);
}


/*!
 *  \brief  Test whether an unsigned int is less than, or equal to another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is less than, or equal to the right one, false if not.
 *  \par Note:
 *    The operator is defined relatively to the functions isLess and isEqual of Beagle::UInt.
 */
inline bool operator<=(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return ( inLeftUInt.isLess(inRightUInt) || inLeftUInt.isEqual(inRightUInt) );
}


/*!
 *  \brief  Test whether an unsigned int is more than another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is more than the right one, false if not.
 *  \par Note:
 *    The operator is defined relatively to the function isLess of Beagle::UInt.
 */
inline bool operator>(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inRightUInt.isLess(inLeftUInt);
}


/*!
 *  \brief  Test whether an unsigned int is more than, or equal to another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is more than, or equal to the right one, false if not.
 *  \par Note:
 *    The operator is defined relatively to the functions isLess and isEqual of Beagle::UInt.
 */
inline bool operator>=(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return ( inRightUInt.isLess(inLeftUInt) || inLeftUInt.isEqual(inRightUInt) );
}


/*!
 *  \brief  Test whether an unsigned int is equal to another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is equal to the right one, false if not.
 *  \par Note:
 *    The operator is defined relatively to the function isEqual of Beagle::UInt.
 */
inline bool operator==(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.isEqual(inRightUInt);
}


/*!
 *  \brief  Test whether an unsigned int is not equal to another.
 *  \param  inLeftUInt  Left unsigned int compared.
 *  \param  inRightUInt Right unsigned int compared.
 *  \return True if left unsigned int is not equal to the right one, false if it is.
 *  \par Note:
 *    The operator is defined relatively to the function isEqual of Beagle::UInt.
 */
inline bool operator!=(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return ( inLeftUInt.isEqual(inRightUInt) == false);
}


/*!
 *  \brief Compare equality of a UInt with a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator==(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() == inRightUInt;
}


/*!
 *  \brief Compare inequality of a UInt with a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator!=(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() != inRightUInt;
}


/*!
 *  \brief Test if a UInt is < than a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator<(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() < inRightUInt;
}


/*!
 *  \brief Test if a UInt is <= than a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator<=(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() <= inRightUInt;
}


/*!
 *  \brief Test if a UInt is > than a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator>(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() > inRightUInt;
}


/*!
 *  \brief Test if a UInt is >= than a unsigned int.
 *  \param inLeftUInt Left value to compare.
 *  \param inRightUInt Right value to compare.
 *  \return Result of the comparison.
 */
inline
bool operator>=(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() >= inRightUInt;
}


/*!
 *  \brief Increment a UInt (prefix version).
 *  \param inUInt UInt to increment.
 *  \return UInt incremented.
 */
inline
Beagle::UInt& operator++(Beagle::UInt& inUInt)
{
  inUInt.getWrappedValue()++;
  return inUInt;
}


/*!
 *  \brief Increment a UInt (postfix version).
 *  \param inUInt UInt to increment.
 *  \return UInt before being incremented.
 */
inline
Beagle::UInt operator++(Beagle::UInt& inUInt, int)
{
  Beagle::UInt lUInt = inUInt;
  inUInt.getWrappedValue()++;
  return lUInt;
}


/*!
 *  \brief Add two UInt.
 *  \param inLeftUInt Left value to add.
 *  \param inRightUInt Right value to add.
 *  \return Result of the addition.
 */
inline
Beagle::UInt operator+(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.getWrappedValue() + inRightUInt.getWrappedValue();
}


/*!
 *  \brief Add a UInt with a unsigned int.
 *  \param inLeftUInt Left value to add.
 *  \param inRightUInt Right value to add.
 *  \return Result of the addition.
 */
inline
Beagle::UInt operator+(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() + inRightUInt;
}


/*!
 *  \brief Add a UInt to a UInt.
 *  \param inLeftUInt Left value to which the right one is added.
 *  \param inRightUInt Value to add.
 *  \return Result of the addition.
 */
inline
Beagle::UInt& operator+=(Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  inLeftUInt.getWrappedValue() += inRightUInt.getWrappedValue();
  return inLeftUInt;
}


/*!
 *  \brief Add a unsigned int to a UInt.
 *  \param inLeftUInt Left value to which the right one is added.
 *  \param inRightUInt Value to add.
 *  \return Result of the addition.
 */
inline
Beagle::UInt& operator+=(Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  inLeftUInt.getWrappedValue() += inRightUInt;
  return inLeftUInt;
}


/*!
 *  \brief Decrement a UInt (prefix version).
 *  \param inUInt UInt to decrement.
 *  \return UInt decremented.
 */
inline
Beagle::UInt& operator--(Beagle::UInt& inUInt)
{
  inUInt.getWrappedValue()--;
  return inUInt;
}


/*!
 *  \brief Decrement a UInt (postfix version).
 *  \param inUInt UInt to decrement.
 *  \return UInt before being decremented.
 */
inline
Beagle::UInt operator--(Beagle::UInt& inUInt, int)
{
  Beagle::UInt lUInt = inUInt;
  inUInt.getWrappedValue()--;
  return lUInt;
}



/*!
 *  \brief Subtract two UInt.
 *  \param inLeftUInt Left value to subtract.
 *  \param inRightUInt Right value to subtract.
 *  \return Result of the subtract.
 */
inline
Beagle::UInt operator-(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.getWrappedValue() - inRightUInt.getWrappedValue();
}


/*!
 *  \brief Subtract a unsigned int from a UInt.
 *  \param inLeftUInt Left value to subtract.
 *  \param inRightUInt Right value to subtract.
 *  \return Result of the subtract.
 */
inline
Beagle::UInt operator-(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() - inRightUInt;
}


/*!
 *  \brief Subtract a UInt from a UInt.
 *  \param inLeftUInt Left value from which the right unsigned int is subtracted.
 *  \param inRightUInt Value to subtract.
 *  \return Result of the subtraction.
 */
inline
Beagle::UInt& operator-=(Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  inLeftUInt.getWrappedValue() -= inRightUInt.getWrappedValue();
  return inLeftUInt;
}


/*!
 *  \brief Subtract a unsigned int from a UInt.
 *  \param inLeftUInt Left value from which the right unsigned int is subtracted.
 *  \param inRightUInt Value to subtract.
 *  \return Result of the subtraction.
 */
inline
Beagle::UInt& operator-=(Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  inLeftUInt.getWrappedValue() -= inRightUInt;
  return inLeftUInt;
}


/*!
 *  \brief Multiply two UInt.
 *  \param inLeftUInt Left value to multiply.
 *  \param inRightUInt Right value to multiply.
 *  \return Result of the multiply.
 */
inline
Beagle::UInt operator*(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.getWrappedValue() * inRightUInt.getWrappedValue();
}


/*!
 *  \brief Multiply a UInt with a unsigned int.
 *  \param inLeftUInt Left value to multiply.
 *  \param inRightUInt Right value to multiply.
 *  \return Result of the multiply.
 */
inline
Beagle::UInt operator*(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() * inRightUInt;
}


/*!
 *  \brief Multiply a UInt with a UInt.
 *  \param inLeftUInt Left value to which the right unsigned int is multiplied.
 *  \param inRightUInt Right value to multiply.
 *  \return Result of the multiplication.
 */
inline
Beagle::UInt& operator*=(Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  inLeftUInt.getWrappedValue() *= inRightUInt.getWrappedValue();
  return inLeftUInt;
}


/*!
 *  \brief Multiply a UInt with a unsigned int.
 *  \param inLeftUInt Left value from which the right unsigned int is multiplied.
 *  \param inRightUInt Right value to multiply.
 *  \return Result of the multiplication.
 */
inline
Beagle::UInt& operator*=(Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  inLeftUInt.getWrappedValue() *= inRightUInt;
  return inLeftUInt;
}


/*!
 *  \brief Divide two UInt.
 *  \param inLeftUInt Left value to divide.
 *  \param inRightUInt Right value to divide.
 *  \return Result of the division.
 */
inline
Beagle::UInt operator/(const Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  return inLeftUInt.getWrappedValue() / inRightUInt.getWrappedValue();
}


/*!
 *  \brief Divide a UInt with a unsigned int.
 *  \param inLeftUInt Left value to divide.
 *  \param inRightUInt Right value to divide.
 *  \return Result of the division.
 */
inline
Beagle::UInt operator/(const Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  return inLeftUInt.getWrappedValue() / inRightUInt;
}


/*!
 *  \brief Divide a UInt with a UInt.
 *  \param inLeftUInt Left value to which the right unsigned int is divided.
 *  \param inRightUInt Right value to divide.
 *  \return Result of the division.
 */
inline
Beagle::UInt& operator/=(Beagle::UInt& inLeftUInt, const Beagle::UInt& inRightUInt)
{
  inLeftUInt.getWrappedValue() /= inRightUInt.getWrappedValue();
  return inLeftUInt;
}


/*!
 *  \brief Divide a UInt with a unsigned int.
 *  \param inLeftUInt Left value from which the right unsigned int is divided.
 *  \param inRightUInt Right value to divide.
 *  \return Result of the division.
 */
inline
Beagle::UInt operator/=(Beagle::UInt& inLeftUInt, unsigned int inRightUInt)
{
  inLeftUInt.getWrappedValue() /= inRightUInt;
  return inLeftUInt;
}


#endif // Beagle_UInt_hpp



