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
|