// $Revision: 1.5 $ // Copyright (C) 1994-1995 Taligent, Inc. All rights reserved. #ifndef TaligentSamples_ADDITIONIMPLEMENTATION #include "AdditionImplementation.h" #endif #ifndef _H_LIMITS #include #endif //---- TAdditionImplementation ----------------------------------------------------------- TaligentTypeExtensionMacro(TAdditionImplementation) TAdditionImplementation::TAdditionImplementation() { } TAdditionImplementation::TAdditionImplementation(const TAdditionImplementation& source) { } TAdditionImplementation::~TAdditionImplementation() { } TAdditionImplementation& TAdditionImplementation::operator=(const TAdditionImplementation& source) { return *this; } TStream& TAdditionImplementation::operator>>=(TStream& toStream) const { short version(kOriginalVersion); version >>= toStream; return toStream; } TStream& TAdditionImplementation::operator<<=(TStream& fromStream) { short version; version <<= fromStream; return fromStream; } long TAdditionImplementation::Add(long num1, long num2) { TestForOverflowAndUnderflow(num1, num2); return num1 + num2; } void TAdditionImplementation::AddOne(long& num) { if (num == LONG_MAX) { throw TMathException(TMathException::kOverflow); } ++num; } void TAdditionImplementation::TestForOverflowAndUnderflow(long num1, long num2) { long absoluteValue = Abs(num1); long amountLeftUntilOverOrUnderflow = LONG_MAX - absoluteValue; if (num1 < 0 && num2 < 0) { // Possible underflow if (Abs(num2) > amountLeftUntilOverOrUnderflow) { throw TMathException(TMathException::kUnderflow); } } else if (num1 > 0 && num2 > 0) { // Possible overflow if (num2 > amountLeftUntilOverOrUnderflow) { throw TMathException(TMathException::kOverflow); } } }