void Quantity::lbmToLbf() { OptionalIPUnit iu = m_units.optionalCast<IPUnit>(); if(!iu) { LOG_AND_THROW("Cannot convert non-IP quantity " << *this << " in system " << system().valueName() << " from pound-mass to pound-force."); } // convert from (value * lb_m^x * ...) to (value * lb_f^x * ...) // lb_m^x * (1/gc)^x = lb_f^x * s^{2x} / ft^x int x = baseUnitExponent("lb_m"); if (x != 0) { iu->lbmToLbf(); m_value /= std::pow(IPUnit::gc(),x); } BOOST_ASSERT(baseUnitExponent("lb_m") == 0); }
bool Unit_Impl::operator==(const Unit& rUnit) const { // construct union of base units StringSet allBaseUnits; StringVector baseUnits; baseUnits = this->baseUnits(); allBaseUnits.insert(baseUnits.begin(),baseUnits.end()); baseUnits = rUnit.baseUnits(); allBaseUnits.insert(baseUnits.begin(),baseUnits.end()); // loop through and see if exponents are equal BOOST_FOREACH(const std::string& baseUnit,allBaseUnits) { if (baseUnitExponent(baseUnit) != rUnit.baseUnitExponent(baseUnit)) { return false; } } return true; }
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; }