std::shared_ptr<OsmAnd::ResolvedMapStyle_P::RuleNode> OsmAnd::ResolvedMapStyle_P::resolveRuleNode( const std::shared_ptr<const UnresolvedMapStyle::RuleNode>& unresolvedRuleNode) { const std::shared_ptr<RuleNode> resolvedRuleNode(new RuleNode( unresolvedRuleNode->isSwitch)); // Resolve values for (const auto& itUnresolvedValueEntry : rangeOf(constOf(unresolvedRuleNode->values))) { const auto& name = itUnresolvedValueEntry.key(); const auto& value = itUnresolvedValueEntry.value(); // Find value definition id and object const auto valueDefId = getValueDefinitionIdByName(name); const auto& valueDef = getValueDefinitionById(valueDefId); if (valueDefId < 0 || !valueDef) { LogPrintf(LogSeverityLevel::Warning, "Ignoring unknown value '%s' = '%s'", qPrintable(name), qPrintable(value)); continue; } // Try to resolve value ResolvedValue resolvedValue; if (!resolveValue(value, valueDef->dataType, valueDef->isComplex, resolvedValue)) { LogPrintf(LogSeverityLevel::Warning, "Ignoring value for '%s' since '%s' can not be resolved", qPrintable(name), qPrintable(value)); continue; } resolvedRuleNode->values[valueDefId] = resolvedValue; } // <switch>/<case> subnodes for (const auto& unresolvedChild : constOf(unresolvedRuleNode->oneOfConditionalSubnodes)) { const auto resolvedChild = resolveRuleNode(unresolvedChild); if (!resolvedChild) return nullptr; resolvedRuleNode->oneOfConditionalSubnodes.push_back(resolvedChild); } // <apply> subnodes for (const auto& unresolvedChild : constOf(unresolvedRuleNode->applySubnodes)) { const auto resolvedChild = resolveRuleNode(unresolvedChild); if (!resolvedChild) return nullptr; resolvedRuleNode->applySubnodes.push_back(resolvedChild); } return resolvedRuleNode; }
static QString resolveFullyQualifiedValue(const QString &value, const QVector<QPair<QString, QString> > &assignments ) { QString val = value; // Only resolve the last statement. int pos = val.lastIndexOf(';'); if (pos > 0) val = val.mid(pos+1); val = qsa_strip_down(val, '(', ')'); val = qsa_strip_down(val, '{', '}'); QStringList l = val.split('.'); QString valuePart; for ( QStringList::const_iterator vit = l.begin(); vit != l.end(); ++vit ) { if ( !valuePart.isNull() ) valuePart += QString::fromLatin1("."); valuePart += (*vit).left( (*vit).indexOf( '(' ) ); QString replacedValue; while ( ( replacedValue = resolveValue( valuePart, assignments ) ) != QString::null ) valuePart = replacedValue; } return valuePart; }
TBS::Nullable<Node::Data> SingleTimespanNodeFilter::filter(const Node::Info & nodeInfo, const Node::Sensor & sensor, const Node::Data & data) { TBS::Nullable<Node::Data> filtered; if (!sourcePass(sensor, sensorKey)) { return filtered; } collected.push_back(data); if (data.getDate() < this->nextAcceptable) { return filtered; } filtered.set(resolveValue(collected, colllectingType)); collected.clear(); do { this->nextAcceptable = this->nextAcceptable + this->timespan; } while (data.getDate() >= this->nextAcceptable); return filtered; }
static QVector<QPair<QString, QString> > parseAssignments(const QString &code) { QChar c, last; enum State { LeftHandSide, RightHandSight, Comment, String, Parentheses } state = LeftHandSide; int parenCount = 0; State lastState = LeftHandSide; // initialize to make compilers happy QChar ignoreEnd[2]; QString leftHandBuffer, rightHandBuffer; QVector<QPair<QString, QString> > assignments; for ( int i = 0; i < code.length(); ++i ) { last = c; c = code[ (int) i]; if ( state == Comment || state == String || state == Parentheses ) { if ( state == String ) APPEND_PARSED_CHAR( lastState ); if ( c == '(' && state == Parentheses ) { parenCount++; continue; } if ( !ignoreEnd[1].isNull() ) { if ( last == ignoreEnd[0] && c == ignoreEnd[1] ) state = (state == String ? lastState : LeftHandSide); } else if ( c == ignoreEnd[0] ) { if ( state == Parentheses ) { parenCount--; if ( parenCount > 0 ) continue; } state = ( (state == String || state == Parentheses) ? lastState : LeftHandSide ); } continue; } if ( c == '*' && last == '/' ) { state = Comment; ignoreEnd[0] = '*'; ignoreEnd[1] = '/'; leftHandBuffer = QString::null; rightHandBuffer = QString::null; continue; } else if ( c == '/' && last == '/' ) { state = Comment; ignoreEnd[0] = '\n'; ignoreEnd[1] = QChar::Null; leftHandBuffer = QString::null; rightHandBuffer = QString::null; continue; } else if ( c == '\"' ) { lastState = state; state = String; ignoreEnd[0] = '\"'; ignoreEnd[1] = QChar::Null; APPEND_PARSED_CHAR( lastState ); continue; } else if ( c == '\'' ) { lastState = state; state = String; ignoreEnd[0] = '\''; ignoreEnd[1] = QChar::Null; APPEND_PARSED_CHAR( lastState ); continue; } else if ( c == '(' ) { lastState = state; state = Parentheses; ignoreEnd[0] = ')'; ignoreEnd[1] = QChar::Null; parenCount = 1; continue; } if ( last.isSpace() ) { if ( i > 1 && code[ (int)(i-2) ] != '.' && c != '=' && c != ';' && c != '{' && c != '}' && c != '(' && c != ')' ) { if ( state == LeftHandSide ) leftHandBuffer = QString::null; else if ( state == RightHandSight ) rightHandBuffer = QString::null; } } if ( c == ';' || c == '{' || c == '}' ) { if ( state == LeftHandSide ) { leftHandBuffer = QString::null; } else if ( state == RightHandSight ) { rightHandBuffer = rightHandBuffer.replace( QRegExp( QString::fromLatin1("\\s") ), QString::fromLatin1("") ); leftHandBuffer = leftHandBuffer.replace( QRegExp( QString::fromLatin1("\\s") ), QString::fromLatin1("") ); QPair<QString, QString> p; p.first = leftHandBuffer; p.second = rightHandBuffer; assignments.prepend( p ); leftHandBuffer = QString::null; rightHandBuffer = QString::null; state = LeftHandSide; continue; } } if ( c == '=' ) { if ( last == '!' || last == '=' ) { leftHandBuffer = QString::null; rightHandBuffer = QString::null; state = LeftHandSide; continue; } if ( state == RightHandSight ) { leftHandBuffer = QString::null; rightHandBuffer = QString::null; state = LeftHandSide; } else if ( state == LeftHandSide ) { state = RightHandSight; } continue; } APPEND_PARSED_CHAR( state ); } for ( QVector<QPair<QString, QString> >::Iterator it = assignments.begin(); it != assignments.end(); ++it ) { QString key = (*it).first; QString value = (*it).second; QStringList l = value.split('.'); QString valuePart; for ( QStringList::ConstIterator vit = l.begin(); vit != l.end(); ++vit ) { if ( !valuePart.isNull() ) valuePart += QString::fromLatin1("."); valuePart += *vit; QString replacedValue; int counter = 0; while ( ( replacedValue = resolveValue( valuePart, assignments ) ) != QString::null ) { if( ++counter > 1000 ) // Avoid recursion... return QVector<QPair<QString,QString> >(); valuePart = replacedValue; } (*it).second = valuePart; } } return assignments; }