Blame examples/money/Money.h

Packit 8c9aa0
// Money.h
Packit 8c9aa0
#ifndef MONEY_H
Packit 8c9aa0
#define MONEY_H
Packit 8c9aa0
Packit 8c9aa0
#include <string>
Packit 8c9aa0
#include <stdexcept>
Packit 8c9aa0
#include <cppunit/portability/Stream.h>    // or <iostream> if portability is not an issue
Packit 8c9aa0
Packit 8c9aa0
class IncompatibleMoneyError : public std::runtime_error
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   IncompatibleMoneyError() : std::runtime_error( "Incompatible moneys" )
Packit 8c9aa0
  {
Packit 8c9aa0
  }
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class Money
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
  Money( double amount, std::string currency )
Packit 8c9aa0
    : m_amount( amount )
Packit 8c9aa0
    , m_currency( currency )
Packit 8c9aa0
  {
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  double getAmount() const
Packit 8c9aa0
  {
Packit 8c9aa0
    return m_amount;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  std::string getCurrency() const
Packit 8c9aa0
  {
Packit 8c9aa0
    return m_currency;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  bool operator ==( const Money &other ) const
Packit 8c9aa0
  {
Packit 8c9aa0
    return m_amount == other.m_amount  &&  
Packit 8c9aa0
           m_currency == other.m_currency;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  bool operator !=( const Money &other ) const
Packit 8c9aa0
  {
Packit 8c9aa0
    return !(*this == other);
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  Money &operator +=( const Money &other )
Packit 8c9aa0
  {
Packit 8c9aa0
    if ( m_currency != other.m_currency )
Packit 8c9aa0
      throw IncompatibleMoneyError();
Packit 8c9aa0
Packit 8c9aa0
    m_amount += other.m_amount;
Packit 8c9aa0
    return *this;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
  double m_amount;
Packit 8c9aa0
  std::string m_currency;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
// The function below could be prototyped as:
Packit 8c9aa0
// inline std::ostream &operator <<( std::ostream &os, const Money &value )
Packit 8c9aa0
// If you know that you will never compile on a platform without std::ostream
Packit 8c9aa0
// (such as embedded vc++ 4.0; though even that platform you can use STLPort)
Packit 8c9aa0
inline CPPUNIT_NS::OStream &operator <<( CPPUNIT_NS::OStream &os, const Money &value )
Packit 8c9aa0
{
Packit 8c9aa0
    return os << "Money< value =" << value.getAmount() << "; currency = " << value.getCurrency() << ">";
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
#endif