boost::optional<Unit> UnitFactorySingleton::createUnitSimple(const std::string& unitString, UnitSystem system) const { if (unitString.empty()) { Unit result = createDimensionlessUnit(system); if (OptionalTemperatureUnit T = result.optionalCast<TemperatureUnit>()) { T->setAsRelative(); } return result; } OptionalUnit candidate; StandardStringLookupMap::const_iterator lookupPair; StandardStringLookupMap::const_iterator standardStringMapEnd = m_standardStringLookupMap.end(); lookupPair = m_standardStringLookupMap.find(unitString); if (lookupPair != standardStringMapEnd) { // unitString is registered BOOST_FOREACH(const std::string& standardString, lookupPair->second) { // instantiate the standardString CallbackMapMap::const_iterator callbackMap; StandardStringCallbackMap::const_iterator callbackPair; OptionalUnit temp; // try base map callbackMap = m_callbackMaps.find(UnitSystem(UnitSystem::Mixed)); BOOST_ASSERT(callbackMap != m_callbackMaps.end()); callbackPair = callbackMap->second.find(standardString); if ((callbackPair != callbackMap->second.end()) && (callbackPair->second != NULL)) { temp = callbackPair->second(); } else { // try system map callbackMap = m_callbackMaps.find(system); if (callbackMap != m_callbackMaps.end()) { callbackPair = callbackMap->second.find(standardString); if ((callbackPair != callbackMap->second.end()) && (callbackPair->second != NULL)) { temp = callbackPair->second(); } } // try all other maps if (!temp) { BOOST_FOREACH(int sysValue, UnitSystem::getValues()) { UnitSystem tempSystem(sysValue); if ((tempSystem == UnitSystem::Mixed) || (tempSystem == system)) { continue; } callbackMap = m_callbackMaps.find(tempSystem); if (callbackMap != m_callbackMaps.end()) { callbackPair = callbackMap->second.find(standardString); if ((callbackPair != callbackMap->second.end()) && (callbackPair->second != NULL)) { temp = callbackPair->second(); break; } } } } }
Quantity::Quantity(double value, const UnitSystem& system) : m_value(value), m_units(createDimensionlessUnit(system)) {}
Quantity::Quantity(const UnitSystem& system) : m_value(0.0), m_units(createDimensionlessUnit(system)) {}