示例#1
0
OSQuantityVector& OSQuantityVector::operator-=(Quantity rQuantity) {

  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 = m_units.baseUnits();
      assert(bus.size() == 1);
      if (m_units.baseUnitExponent(bus[0]) == 1) {
        setAsRelative();
        rQuantity.setAsRelative();
      }
    } else if (!isAbsolute() && rQuantity.isAbsolute()) {
      setAsAbsolute();
    } else if (isAbsolute() && !rQuantity.isAbsolute()) {
      rQuantity.setAsAbsolute();
    }
  }

  if (units() != rQuantity.units()) {
    LOG_AND_THROW("Cannot subtract OSQuantityVector and Quantity with different units (" << units()
                  << " and " << rQuantity.units() << ").");
  }

  if (scale() != rQuantity.scale()) {
    rQuantity.setScale(scale().exponent);
  }

  double value = rQuantity.value();
  for (unsigned i = 0, n = size(); i < n; ++i) {
    m_values[i] -= value;
  }

  return *this;
}
示例#2
0
OSQuantityVector& OSQuantityVector::operator-=(OSQuantityVector rVector) {

  unsigned n = size();
  if (this == &rVector) {
    clear();
    resize(n,0.0);
    return *this;
  }

  if (isTemperature() && rVector.isTemperature()) {
    if (isAbsolute() && rVector.isAbsolute()) {
      // units must be the same, check that exponent on this is 1
      std::vector<std::string> bus = m_units.baseUnits();
      assert(bus.size() == 1);
      if (m_units.baseUnitExponent(bus[0]) == 1) {
        setAsRelative();
        rVector.setAsRelative();
      }
    } else if (!isAbsolute() && rVector.isAbsolute()) {
      setAsAbsolute();
    } else if (isAbsolute() && !rVector.isAbsolute()) {
      rVector.setAsAbsolute();
    }
  }

  if (units() != rVector.units()) {
    LOG_AND_THROW("Cannot subtract OSQuantityVectors with different units (" << units()
                  << " and " << rVector.units() << ").");
  }

  if (rVector.size() != n) {
    LOG_AND_THROW("Cannot subtract vectors of different sizes.");
  }

  if (scale() != rVector.scale()) {
    rVector.setScale(scale().exponent);
  }

  DoubleVector rValues = rVector.values();
  for (unsigned i = 0; i < n; ++i) {
    m_values[i] -= rValues[i];
  }

  return *this;
}
示例#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;
}