Example #1
0
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);
}
Example #2
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;
  }
Example #3
0
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;
}