Quantity& Quantity::operator+=(const Quantity& temp) { if (this == &temp) { m_value *= 2.0; return *this; } // copy input reference so we can change its properties Quantity rQuantity(temp); if (isTemperature() && rQuantity.isTemperature()) { if (!isAbsolute() && rQuantity.isAbsolute()) { setAsAbsolute(); } else if (isAbsolute() && !rQuantity.isAbsolute()){ rQuantity.setAsAbsolute(); } } if (m_units != rQuantity.m_units) { LOG_AND_THROW("Cannot add quantities with different units."); } if (scale() != rQuantity.scale()) { Quantity wRQuantity(rQuantity); wRQuantity.setScale(scale().exponent); m_value += wRQuantity.value(); } else { m_value += rQuantity.value(); } return *this; }
Quantity& Quantity::operator+=(const Quantity& rQuantity) { if (this == &rQuantity) { m_value *= 2.0; return *this; } if (m_units != rQuantity.m_units) { LOG_AND_THROW("Cannot add quantities with different units."); } if (scale() != rQuantity.scale()) { Quantity wRQuantity(rQuantity); wRQuantity.setScale(scale().exponent); m_value += wRQuantity.value(); } else { m_value += rQuantity.value(); } if (isTemperature() && rQuantity.isTemperature()) { if (!isAbsolute() && rQuantity.isAbsolute()) { setAsAbsolute(); } } return *this; }
Quantity& Quantity::operator-=(const Quantity& temp) { if (this == &temp) { m_value = 0.0; return *this; } // copy input reference so we can change its properties Quantity rQuantity(temp); if (isTemperature() && rQuantity.isTemperature()) { if (isAbsolute() && rQuantity.isAbsolute()) { // units must be the same, check that exponent on this is 1 std::vector<std::string> bus = baseUnits(); OS_ASSERT(bus.size() == 1); if (baseUnitExponent(bus[0]) == 1) { setAsRelative(); rQuantity.setAsRelative(); } } else if (!isAbsolute() && rQuantity.isAbsolute()) { setAsAbsolute(); } else if (isAbsolute() && !rQuantity.isAbsolute()) { rQuantity.setAsAbsolute(); } } if (m_units != rQuantity.m_units) { LOG_AND_THROW("Cannot subtract quantities with different units."); } if (scale() != rQuantity.scale()) { Quantity wRQuantity(rQuantity); wRQuantity.setScale(scale().exponent); m_value -= wRQuantity.value(); } else { m_value -= rQuantity.value(); } return *this; }