本文整理汇总了C++中QStack::top方法的典型用法代码示例。如果您正苦于以下问题:C++ QStack::top方法的具体用法?C++ QStack::top怎么用?C++ QStack::top使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QStack
的用法示例。
在下文中一共展示了QStack::top方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: doParse
//.........这里部分代码省略.........
int x1, y1;
bool compressed_list;
// check for compressed lists
if (toParse->at(pos+3) == ':')
{
x1 = toParse->at(pos+4).unicode() -a_offset;// - 'a' + 1;
y1 = toParse->at(pos+5).unicode() -a_offset;// - 'a' + 1;
compressed_list = true;
}
else
{
x1 = x;
y1 = y;
compressed_list = false;
}
/*
* TODO Do we nned this when the tree is created from file ?
* boardHandler->setModeSGF(setup || compressed_list ? modeEdit : modeNormal);
*/
int i, j;
for (i = x; i <= x1; i++)
for (j = y; j <= y1; j++)
{
if (prop == editErase)
{
tree->addStoneToCurrentMove(stoneErase, i, j);
}
else
{
if(setup)
{
if ((!remember_root) && (stack.top() == tree->getCurrent()))
tree->addEmptyMove(); //if this is first in branch we need to add an empty move
tree->addStoneToCurrentMove(black ? stoneBlack : stoneWhite, i, j);
}
else
{
Move *result = tree->getCurrent()->makeMove(black ? stoneBlack : stoneWhite, i, j);
if (result)
tree->setCurrent(result);
}
}
// tree->getCurrent()->getMatrix()->debug();
//qDebug("ADDING MOVE %s %d/%d", black?"B":"W", x, y);
// Remember this move for later, to remove from the matrix.
position = new Position;
position->x = i;
position->y = j;
toRemove.push(position);
moves ++;
}
if (compressed_list)
// Advance pos by 7
pos += 7;
else
// Advance pos by 4
pos += 4;
break;
}
case nodeName:
示例2: validateMessage
QString MessageValidator::validateMessage(QString message, bool* illformed, HTMLTextFormatter* formatter) {
// qDebug() << "IMG val0" << message;
QDomDocument doc("document");
*illformed = false;
QString errorMessage;
int line, column;
QDomDocument tmpDoc; //used by textformatter
xmlSource.setData(message);
if (!doc.setContent(&xmlSource, &xmlReader, &errorMessage, &line, &column)) {
qDebug() << errorMessage << " " << line << " " << column << message;
*illformed = true;
qDebug() << "WARNING: MessageValidator::validateMessage() - illformed message";
return "illformed message!!!";
}
//now DOM tree will be traversed in preorder.
QStack<QDomElement> stack; //current element, QStack is used to avoid possible stack overflow in ordinary recursion
stack.push(doc.documentElement());
while (!stack.empty()) {
QDomElement cur = stack.top();
stack.pop();
// Traverse through DOM Tree(cur), cut off bad elements/attributes
// and format text nodes using textFormatter
// qDebug() << QString(4, ' ') << cur.tagName();
QString parentName = cur.tagName();
NodeInfo curNI = allowed[parentName];
//delete disallowed attributes
for (int i = 0; i < cur.attributes().count(); i++) {
QString attrName = cur.attributes().item(i).toAttr().name();
if (!curNI.allowedAttributes.contains(attrName)) {
// qDebug() << "VALIDATIN ERR" << "TA" << attrName << " in " << parentName;
// qDebug() << "note allowed attributes are:" << curNI.allowedAttributes;
cur.attributes().removeNamedItem(attrName);
i--;
}
}
QDomNodeList children = cur.childNodes();
for (int i = children.size() - 1; i >= 0; i--) {
QDomNode node = children.at(i);
if (node.isElement()) {
QString childName = node.toElement().tagName();
if (childName == "a") { // always show hyperlink destination
QString href = node.toElement().attribute("href");
node.appendChild(doc.createTextNode(" [ " + href + " ]"));
}
if (childName == "style") { //NOTE: this action is not XHTML-IM compliant! (css rules should be displayed, but it's stupid)
cur.removeChild(node);
}
else if (childName == "img") { //disabling images until they are whitelisted
QString href = node.toElement().attribute("src");
QDomElement newElement = doc.createElement("a");
newElement.setAttribute("class", "psi_disabled_image");
newElement.setAttribute("href", "javascript:psi_addToWhiteList('" + href + "')");
newElement.appendChild(doc.createTextNode("[ click here to display: " + href + " ]"));
cur.replaceChild(newElement, node);
}
else if (!curNI.allowedTags.contains(childName)) {//is subElement valid here?
qDebug() << "VALIDATIN ERR" << "TS" << childName << " in " << parentName;
qDebug() << "note allowed subElements are:" << curNI.allowedTags;
//append bad node's children (they will be validated in next loop iteration)
int j = 0;
while (node.hasChildNodes()) {
cur.insertBefore(node.firstChild(), node);
j++;
}
i = i + j; //j nodes were inserted
//delete bad node
cur.removeChild(node);
}
else {
stack.push(node.toElement());
}
}
else if (node.isText() && !node.isCDATASection()) {
if (!curNI.canHaveText) {
cur.removeChild(node);
}
//.........这里部分代码省略.........
示例3: parse
//.........这里部分代码省略.........
// ok,
} else if (match(Tok_Comma)) {
plural = true;
}
}
if (!text.isEmpty())
recordMessage(tor, context(), text, com, extracomment, plural);
}
break;
case Tok_translate:
{
QString contextOverride;
yyTok = getToken();
if ( match(Tok_LeftParen) &&
matchString(contextOverride) &&
match(Tok_Comma) &&
matchString(text) ) {
com.clear();
bool plural = false;
if (!match(Tok_RightParen)) {
// look for comment
if ( match(Tok_Comma) && matchStringOrNull(com)) {
if (!match(Tok_RightParen)) {
if (match(Tok_Comma) && matchExpression() && match(Tok_RightParen)) {
plural = true;
} else {
break;
}
}
} else {
break;
}
}
if (!text.isEmpty())
recordMessage(tor, contextOverride, text, com, extracomment, plural);
}
}
break;
case Tok_Ident:
yyTok = getToken();
break;
case Tok_Comment:
if (yyComment.startsWith(QLatin1Char(':'))) {
yyComment.remove(0, 1);
extracomment.append(yyComment);
}
yyTok = getToken();
break;
case Tok_RightBrace:
if ( yyScope.isEmpty() ) {
yyMsg() << qPrintable(LU::tr("Excess closing brace.\n"));
}
else
delete (yyScope.pop());
extracomment.clear();
yyTok = getToken();
break;
case Tok_LeftBrace:
yyScope.push(new Scope(QString(), Scope::Other, yyLineNo));
yyTok = getToken();
break;
case Tok_Semicolon:
extracomment.clear();
yyTok = getToken();
break;
case Tok_Package:
yyTok = getToken();
while(!match(Tok_Semicolon)) {
switch(yyTok) {
case Tok_Ident:
yyPackage.append(yyIdent);
break;
case Tok_Dot:
yyPackage.append(QLatin1String("."));
break;
default:
yyMsg() << qPrintable(LU::tr("'package' must be followed by package name.\n"));
break;
}
yyTok = getToken();
}
break;
default:
yyTok = getToken();
}
}
if ( !yyScope.isEmpty() )
yyMsg(yyScope.top()->line) << qPrintable(LU::tr("Unbalanced opening brace.\n"));
else if ( yyParenDepth != 0 )
yyMsg(yyParenLineNo) << qPrintable(LU::tr("Unbalanced opening parenthesis.\n"));
}
示例4: load
void Loader::load()
{
QFile in(QLatin1String("tree.xml"));
/* LoadingModel::m_result will be null, signalling failure. */
if(!in.open(QIODevice::ReadOnly))
return;
QXmlStreamReader reader(&in);
while(!reader.atEnd())
{
reader.readNext();
switch(reader.tokenType())
{
case QXmlStreamReader::StartDocument:
/* Fallthrough. */
case QXmlStreamReader::StartElement:
{
QXmlName name;
if(reader.tokenType() == QXmlStreamReader::StartElement)
{
name = QXmlName(m_namePool,
reader.name().toString(),
reader.namespaceUri().toString(),
reader.prefix().toString());
}
/* Else, the name is null. */
LoadingModel::Node *const tmp = new LoadingModel::Node(reader.tokenType() == QXmlStreamReader::StartElement
? QXmlNodeModelIndex::Element
: QXmlNodeModelIndex::Document,
m_parentStack.top(),
QString(),
name);
m_result.append(tmp);
if(m_currentNode)
{
if(m_currentNode->parent == m_parentStack.top())
m_currentNode->followingSibling = tmp;
}
const QXmlStreamAttributes attributes(reader.attributes());
const int len = attributes.count();
for(int i = 0; i < len; ++i)
{
const QXmlStreamAttribute &attr = attributes.at(i);
const LoadingModel::Node *const a = new LoadingModel::Node(QXmlNodeModelIndex::Attribute,
m_parentStack.top(),
attr.value().toString(),
QXmlName(m_namePool,
attr.name().toString(),
attr.namespaceUri().toString(),
attr.prefix().toString()));
/* We add it also to m_result such that compareOrder() is correct
* for attributes. m_result owns a. */
tmp->attributes.append(a);
m_result.append(a);
}
adjustSiblings(tmp);
m_parentStack.push(m_currentNode);
break;
}
case QXmlStreamReader::EndDocument:
/* Fallthrough. */
case QXmlStreamReader::EndElement:
{
m_currentNode->followingSibling = 0;
m_currentNode = m_parentStack.pop();
if(reader.tokenType() == QXmlStreamReader::EndDocument)
const_cast<LoadingModel::Node *>(m_result.first())->followingSibling = 0;
break;
}
case QXmlStreamReader::Characters:
{
LoadingModel::Node *const tmp = new LoadingModel::Node(QXmlNodeModelIndex::Text, m_parentStack.top(), reader.text().toString());
m_result.append(tmp);
adjustSiblings(tmp);
break;
}
case QXmlStreamReader::ProcessingInstruction:
{
LoadingModel::Node *const tmp = new LoadingModel::Node(QXmlNodeModelIndex::ProcessingInstruction,
m_parentStack.top(),
reader.processingInstructionData().toString(),
QXmlName(m_namePool, reader.processingInstructionTarget().toString()));
m_result.append(tmp);
adjustSiblings(tmp);
break;
}
case QXmlStreamReader::Comment:
{
LoadingModel::Node *const tmp = new LoadingModel::Node(QXmlNodeModelIndex::Comment, m_parentStack.top(), reader.text().toString());
m_result.append(tmp);
adjustSiblings(tmp);
//.........这里部分代码省略.........
示例5: buildTree
TableFieldBinaryTreeEvalNode* TableFieldBinaryTreeEvalNode::buildTree(QList<TableFieldEvalNode *>& list, QObject *parent)
{
if (list.isEmpty())
{
return nullptr;
}
// Build a new list that is surrounded with parenthesis.
QList<TableFieldEvalNode *> safeList;
TableFieldEvalNode leftParenEvalNode(TableFieldEvalNode::L_PAREN);
TableFieldEvalNode rightParenEvalNode(TableFieldEvalNode::R_PAREN);
TableFieldBinaryTreeEvalNode* headNode = new TableFieldBinaryTreeEvalNode(parent);
safeList.append(&leftParenEvalNode);
safeList.append(list);
safeList.append(&rightParenEvalNode);
bool isError = false;
QStack<TableFieldBinaryTreeEvalNode*> values;
QStack<TableFieldBinaryTreeEvalNode*> operators;
QListIterator<TableFieldEvalNode*> i(safeList);
while (i.hasNext() && !isError)
{
TableFieldEvalNode* eNode = i.next();
if (eNode == nullptr)
{
qDebug(qPrintable(tr("Cannot build a tree from null nodes.")));
isError = true;
}
else if (eNode->isValue())
{
// Push value nodes on the value stack.
TableFieldBinaryTreeEvalNode* bNode = new TableFieldBinaryTreeEvalNode(headNode);
bNode->setNode(eNode->clone(bNode));
values.push(bNode);
}
else if (eNode->isLeftParen())
{
// Push left parenthesis onto the operator stack.
// Will be removed when a right parenthesis is found.
TableFieldBinaryTreeEvalNode* bNode = new TableFieldBinaryTreeEvalNode(headNode);
bNode->setNode(eNode->clone(bNode));
operators.push(bNode);
}
else if (eNode->isRightParen())
{
// Found a right parenthesis.
// Process all operators until a left parenthesis is found then get rid of it.
while (!isError && !operators.isEmpty() && !operators.top()->isLeftParen())
{
isError = processOneTreeLevel(values, operators);
}
if (!isError)
{
if (operators.isEmpty())
{
qDebug(qPrintable(tr("Have a ')' without a '('")));
isError = true;
}
else
{
// Dispose of the open parenthesis.
TableFieldBinaryTreeEvalNode* opNode = operators.pop();
delete opNode;
}
}
}
else if (eNode->isNoType())
{
qDebug(qPrintable(tr("Cannot build a tree from raw nodes with no type")));
isError = true;
}
else
{
// Found an operator.
// Process all operators whose priority / precidence is the same or greater than this one.
// So, after reading "a OR b OR", you know you can set "a OR b", but you don't know yet if you can
// process the second OR.
while (!isError && !operators.isEmpty() && !operators.top()->isLeftParen() && operators.top()->nodePriority() >= eNode->nodePriority())
{
isError = processOneTreeLevel(values, operators);
}
if (!isError)
{
// No error, so push the operator onto the operator stack.
TableFieldBinaryTreeEvalNode* bNode = new TableFieldBinaryTreeEvalNode(headNode);
bNode->setNode(eNode->clone(bNode));
operators.push(bNode);
}
}
}
if (!isError)
{
if (!operators.isEmpty())
{
isError = true;
qDebug(qPrintable(tr("Unprocessed Operators left in the stack after processing")));
}
//.........这里部分代码省略.........
示例6: parse
TypeParser::Info TypeParser::parse(const QString &str) {
Scanner scanner(str);
Info info;
QStack<Info *> stack;
stack.push(&info);
bool colon_prefix = false;
bool in_array = false;
QString array;
Scanner::Token tok = scanner.nextToken();
while (tok != Scanner::NoToken) {
switch (tok) {
case Scanner::StarToken:
++stack.top()->indirections;
break;
case Scanner::AmpersandToken:
stack.top()->is_reference = true;
break;
case Scanner::LessThanToken:
stack.top()->template_instantiations << Info();
stack.push(&stack.top()->template_instantiations.last());
break;
case Scanner::CommaToken:
stack.pop();
stack.top()->template_instantiations << Info();
stack.push(&stack.top()->template_instantiations.last());
break;
case Scanner::GreaterThanToken:
stack.pop();
break;
case Scanner::ColonToken:
colon_prefix = true;
break;
case Scanner::ConstToken:
stack.top()->is_constant = true;
break;
case Scanner::OpenParenToken: // function pointers not supported
case Scanner::CloseParenToken: {
Info i;
i.is_busted = true;
return i;
}
case Scanner::Identifier:
parseIdentifier(scanner, stack, array, in_array, colon_prefix);
break;
case Scanner::SquareBegin:
in_array = true;
break;
case Scanner::SquareEnd:
in_array = false;
stack.top()->arrays += array;
break;
default:
break;
}
tok = scanner.nextToken();
}
return info;
}
示例7: parseTrace
void TraceLoader::parseTrace()
{
QList<ApiTraceFrame*> frames;
ApiTraceFrame *currentFrame = 0;
int frameCount = 0;
QStack<ApiTraceCall*> groups;
QVector<ApiTraceCall*> topLevelItems;
QVector<ApiTraceCall*> allCalls;
quint64 binaryDataSize = 0;
int lastPercentReport = 0;
trace::Call *call = m_parser.parse_call();
while (call) {
//std::cout << *call;
if (!currentFrame) {
currentFrame = new ApiTraceFrame();
currentFrame->number = frameCount;
++frameCount;
}
ApiTraceCall *apiCall =
apiCallFromTraceCall(call, m_helpHash, currentFrame, groups.isEmpty() ? 0 : groups.top(), this);
allCalls.append(apiCall);
if (groups.count() == 0) {
topLevelItems.append(apiCall);
}
if (call->flags & trace::CALL_FLAG_MARKER_PUSH) {
groups.push(apiCall);
} else if (call->flags & trace::CALL_FLAG_MARKER_POP) {
groups.top()->finishedAddingChildren();
groups.pop();
}
if (!groups.isEmpty()) {
groups.top()->addChild(apiCall);
}
if (apiCall->hasBinaryData()) {
QByteArray data =
apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
binaryDataSize += data.size();
}
if (call->flags & trace::CALL_FLAG_END_FRAME) {
allCalls.squeeze();
topLevelItems.squeeze();
if (topLevelItems.count() == allCalls.count()) {
currentFrame->setCalls(allCalls, allCalls, binaryDataSize);
} else {
currentFrame->setCalls(topLevelItems, allCalls, binaryDataSize);
}
allCalls.clear();
groups.clear();
topLevelItems.clear();
frames.append(currentFrame);
currentFrame = 0;
binaryDataSize = 0;
if (frames.count() >= FRAMES_TO_CACHE) {
emit framesLoaded(frames);
frames.clear();
}
if (m_parser.percentRead() - lastPercentReport >= 5) {
emit parsed(m_parser.percentRead());
lastPercentReport = m_parser.percentRead();
}
}
delete call;
call = m_parser.parse_call();
}
//last frames won't have markers
// it's just a bunch of Delete calls for every object
// after the last SwapBuffers
if (currentFrame) {
allCalls.squeeze();
if (topLevelItems.count() == allCalls.count()) {
currentFrame->setCalls(allCalls, allCalls, binaryDataSize);
} else {
currentFrame->setCalls(topLevelItems, allCalls, binaryDataSize);
}
frames.append(currentFrame);
currentFrame = 0;
}
if (frames.count()) {
emit framesLoaded(frames);
}
}
示例8: copyNodeTo
void AccelTree::copyNodeTo(const QXmlNodeModelIndex &node,
QAbstractXmlReceiver *const receiver,
const NodeCopySettings &settings) const
{
/* This code piece can be seen as a customized version of
* QAbstractXmlReceiver::item/sendAsNode(). */
Q_ASSERT(receiver);
Q_ASSERT(!node.isNull());
typedef QHash<QXmlName::PrefixCode, QXmlName::NamespaceCode> Binding;
QStack<Binding> outputted;
switch(node.kind())
{
case QXmlNodeModelIndex::Element:
{
outputted.push(Binding());
/* Add the namespace for our element name. */
const QXmlName elementName(node.name());
receiver->startElement(elementName);
if(!settings.testFlag(InheritNamespaces))
receiver->namespaceBinding(QXmlName(StandardNamespaces::StopNamespaceInheritance, 0,
StandardPrefixes::StopNamespaceInheritance));
if(settings.testFlag(PreserveNamespaces))
node.sendNamespaces(receiver);
else
{
/* Find the namespaces that we actually use and add them to outputted. These are drawn
* from the element name, and the node's attributes. */
outputted.top().insert(elementName.prefix(), elementName.namespaceURI());
const QXmlNodeModelIndex::Iterator::Ptr attributes(iterate(node, QXmlNodeModelIndex::AxisAttribute));
QXmlNodeModelIndex attr(attributes->next());
while(!attr.isNull())
{
const QXmlName &attrName = attr.name();
outputted.top().insert(attrName.prefix(), attrName.namespaceURI());
attr = attributes->next();
}
Binding::const_iterator it(outputted.top().constBegin());
const Binding::const_iterator end(outputted.top().constEnd());
for(; it != end; ++it)
receiver->namespaceBinding(QXmlName(it.value(), 0, it.key()));
}
/* Send the attributes of the element. */
{
QXmlNodeModelIndex::Iterator::Ptr attributes(node.iterate(QXmlNodeModelIndex::AxisAttribute));
QXmlNodeModelIndex attribute(attributes->next());
while(!attribute.isNull())
{
const QString &v = attribute.stringValue();
receiver->attribute(attribute.name(), QStringRef(&v));
attribute = attributes->next();
}
}
/* Send the children of the element. */
copyChildren(node, receiver, settings);
receiver->endElement();
outputted.pop();
break;
}
case QXmlNodeModelIndex::Document:
{
/* We need to intercept and grab the elements of the document node, such
* that we preserve/inherit preference applies to them. */
receiver->startDocument();
copyChildren(node, receiver, settings);
receiver->endDocument();
break;
}
default:
receiver->item(node);
}
}
示例9: interpretResourceFile
bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice,
const QString &fname, QString currentPath, bool ignoreErrors)
{
Q_ASSERT(m_errorDevice);
const QChar slash = QLatin1Char('/');
if (!currentPath.isEmpty() && !currentPath.endsWith(slash))
currentPath += slash;
QXmlStreamReader reader(inputDevice);
QStack<RCCXmlTag> tokens;
QString prefix;
QLocale::Language language = QLocale::c().language();
QLocale::Country country = QLocale::c().country();
QString alias;
int compressLevel = m_compressLevel;
int compressThreshold = m_compressThreshold;
while (!reader.atEnd()) {
QXmlStreamReader::TokenType t = reader.readNext();
switch (t) {
case QXmlStreamReader::StartElement:
if (reader.name() == m_strings.TAG_RCC) {
if (!tokens.isEmpty())
reader.raiseError(QLatin1String("expected <RCC> tag"));
else
tokens.push(RccTag);
} else if (reader.name() == m_strings.TAG_RESOURCE) {
if (tokens.isEmpty() || tokens.top() != RccTag) {
reader.raiseError(QLatin1String("unexpected <RESOURCE> tag"));
} else {
tokens.push(ResourceTag);
QXmlStreamAttributes attributes = reader.attributes();
language = QLocale::c().language();
country = QLocale::c().country();
if (attributes.hasAttribute(m_strings.ATTRIBUTE_LANG)) {
QString attribute = attributes.value(m_strings.ATTRIBUTE_LANG).toString();
QLocale lang = QLocale(attribute);
language = lang.language();
if (2 == attribute.length()) {
// Language only
country = QLocale::AnyCountry;
} else {
country = lang.country();
}
}
prefix.clear();
if (attributes.hasAttribute(m_strings.ATTRIBUTE_PREFIX))
prefix = attributes.value(m_strings.ATTRIBUTE_PREFIX).toString();
if (!prefix.startsWith(slash))
prefix.prepend(slash);
if (!prefix.endsWith(slash))
prefix += slash;
}
} else if (reader.name() == m_strings.TAG_FILE) {
if (tokens.isEmpty() || tokens.top() != ResourceTag) {
reader.raiseError(QLatin1String("unexpected <FILE> tag"));
} else {
tokens.push(FileTag);
QXmlStreamAttributes attributes = reader.attributes();
alias.clear();
if (attributes.hasAttribute(m_strings.ATTRIBUTE_ALIAS))
alias = attributes.value(m_strings.ATTRIBUTE_ALIAS).toString();
compressLevel = m_compressLevel;
if (attributes.hasAttribute(m_strings.ATTRIBUTE_COMPRESS))
compressLevel = attributes.value(m_strings.ATTRIBUTE_COMPRESS).toString().toInt();
compressThreshold = m_compressThreshold;
if (attributes.hasAttribute(m_strings.ATTRIBUTE_THRESHOLD))
compressThreshold = attributes.value(m_strings.ATTRIBUTE_THRESHOLD).toString().toInt();
// Special case for -no-compress. Overrides all other settings.
if (m_compressLevel == -2)
compressLevel = 0;
}
} else {
reader.raiseError(QString(QLatin1String("unexpected tag: %1")).arg(reader.name().toString()));
}
break;
case QXmlStreamReader::EndElement:
if (reader.name() == m_strings.TAG_RCC) {
if (!tokens.isEmpty() && tokens.top() == RccTag)
tokens.pop();
else
reader.raiseError(QLatin1String("unexpected closing tag"));
} else if (reader.name() == m_strings.TAG_RESOURCE) {
if (!tokens.isEmpty() && tokens.top() == ResourceTag)
tokens.pop();
else
reader.raiseError(QLatin1String("unexpected closing tag"));
} else if (reader.name() == m_strings.TAG_FILE) {
if (!tokens.isEmpty() && tokens.top() == FileTag)
tokens.pop();
else
//.........这里部分代码省略.........
示例10: start
void OwncloudPropagator::start(const SyncFileItemVector &items)
{
Q_ASSERT(std::is_sorted(items.begin(), items.end()));
/* This builds all the jobs needed for the propagation.
* Each directory is a PropagateDirectory job, which contains the files in it.
* In order to do that we loop over the items. (which are sorted by destination)
* When we enter a directory, we can create the directory job and push it on the stack. */
_rootJob.reset(new PropagateDirectory(this));
QStack<QPair<QString /* directory name */, PropagateDirectory * /* job */>> directories;
directories.push(qMakePair(QString(), _rootJob.data()));
QVector<PropagatorJob *> directoriesToRemove;
QString removedDirectory;
foreach (const SyncFileItemPtr &item, items) {
if (!removedDirectory.isEmpty() && item->_file.startsWith(removedDirectory)) {
// this is an item in a directory which is going to be removed.
PropagateDirectory *delDirJob = qobject_cast<PropagateDirectory *>(directoriesToRemove.first());
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
// already taken care of. (by the removal of the parent directory)
// increase the number of subjobs that would be there.
if (delDirJob) {
delDirJob->increaseAffectedCount();
}
continue;
} else if (item->isDirectory()
&& (item->_instruction == CSYNC_INSTRUCTION_NEW
|| item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE)) {
// create a new directory within a deleted directory? That can happen if the directory
// etag was not fetched properly on the previous sync because the sync was aborted
// while uploading this directory (which is now removed). We can ignore it.
if (delDirJob) {
delDirJob->increaseAffectedCount();
}
continue;
} else if (item->_instruction == CSYNC_INSTRUCTION_IGNORE) {
continue;
} else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
// all is good, the rename will be executed before the directory deletion
} else {
qCWarning(lcPropagator) << "WARNING: Job within a removed directory? This should not happen!"
<< item->_file << item->_instruction;
}
}
while (!item->destination().startsWith(directories.top().first)) {
directories.pop();
}
if (item->isDirectory()) {
PropagateDirectory *dir = new PropagateDirectory(this, item);
if (item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE
&& item->_direction == SyncFileItem::Up) {
// Skip all potential uploads to the new folder.
// Processing them now leads to problems with permissions:
// checkForPermissions() has already run and used the permissions
// of the file we're about to delete to decide whether uploading
// to the new dir is ok...
foreach (const SyncFileItemPtr &item2, items) {
if (item2->destination().startsWith(item->destination() + "/")) {
item2->_instruction = CSYNC_INSTRUCTION_NONE;
_anotherSyncNeeded = true;
}
}
}
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
// We do the removal of directories at the end, because there might be moves from
// these directories that will happen later.
directoriesToRemove.prepend(dir);
removedDirectory = item->_file + "/";
// We should not update the etag of parent directories of the removed directory
// since it would be done before the actual remove (issue #1845)
// NOTE: Currently this means that we don't update those etag at all in this sync,
// but it should not be a problem, they will be updated in the next sync.
for (int i = 0; i < directories.size(); ++i) {
if (directories[i].second->_item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA)
directories[i].second->_item->_instruction = CSYNC_INSTRUCTION_NONE;
}
} else {
PropagateDirectory *currentDirJob = directories.top().second;
currentDirJob->appendJob(dir);
}
directories.push(qMakePair(item->destination() + "/", dir));
} else {
示例11: frameContentsLoaded
QVector<ApiTraceCall*>
TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
{
Q_ASSERT(currentFrame);
if (currentFrame->isLoaded()) {
return currentFrame->calls();
}
if (m_parser.supportsOffsets()) {
unsigned frameIdx = currentFrame->number;
int numOfCalls = numberOfCallsInFrame(frameIdx);
if (numOfCalls) {
quint64 binaryDataSize = 0;
QStack<ApiTraceCall*> groups;
QVector<ApiTraceCall*> topLevelItems;
QVector<ApiTraceCall*> allCalls(numOfCalls);
const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
m_parser.setBookmark(frameBookmark.start);
trace::Call *call;
int parsedCalls = 0;
while ((call = m_parser.parse_call())) {
ApiTraceCall *apiCall =
apiCallFromTraceCall(call, m_helpHash,
currentFrame, groups.isEmpty() ? 0 : groups.top(), this);
Q_ASSERT(apiCall);
Q_ASSERT(parsedCalls < allCalls.size());
allCalls[parsedCalls++] = apiCall;
if (groups.count() == 0) {
topLevelItems.append(apiCall);
} else {
groups.top()->addChild(apiCall);
}
if (call->flags & trace::CALL_FLAG_MARKER_PUSH) {
groups.push(apiCall);
} else if (call->flags & trace::CALL_FLAG_MARKER_POP) {
if (groups.count()) {
groups.top()->finishedAddingChildren();
groups.pop();
}
}
if (apiCall->hasBinaryData()) {
QByteArray data =
apiCall->arguments()[
apiCall->binaryDataIndex()].toByteArray();
binaryDataSize += data.size();
}
delete call;
if (apiCall->flags() & trace::CALL_FLAG_END_FRAME) {
break;
}
}
// There can be fewer parsed calls when call in different
// threads cross the frame boundary
Q_ASSERT(parsedCalls <= numOfCalls);
Q_ASSERT(parsedCalls <= allCalls.size());
allCalls.resize(parsedCalls);
allCalls.squeeze();
Q_ASSERT(parsedCalls <= currentFrame->numChildrenToLoad());
if (topLevelItems.count() == allCalls.count()) {
emit frameContentsLoaded(currentFrame, allCalls,
allCalls, binaryDataSize);
} else {
emit frameContentsLoaded(currentFrame, topLevelItems,
allCalls, binaryDataSize);
}
return allCalls;
}
}
return QVector<ApiTraceCall*>();
}
示例12: loadData
void QmlProfilerEventsModelProxy::loadData(qint64 rangeStart, qint64 rangeEnd)
{
clear();
qint64 qmlTime = 0;
qint64 lastEndTime = 0;
QHash <int, QVector<qint64> > durations;
const bool checkRanges = (rangeStart != -1) && (rangeEnd != -1);
const QVector<QmlProfilerDataModel::QmlEventData> &eventList
= d->modelManager->qmlModel()->getEvents();
const QVector<QmlProfilerDataModel::QmlEventTypeData> &typesList
= d->modelManager->qmlModel()->getEventTypes();
// used by binding loop detection
QStack<const QmlProfilerDataModel::QmlEventData*> callStack;
callStack.push(0); // artificial root
for (int i = 0; i < eventList.size(); ++i) {
const QmlProfilerDataModel::QmlEventData *event = &eventList[i];
const QmlProfilerDataModel::QmlEventTypeData *type = &typesList[event->typeIndex];
if (!d->acceptedTypes.contains(type->rangeType))
continue;
if (checkRanges) {
if ((event->startTime + event->duration < rangeStart)
|| (event->startTime > rangeEnd))
continue;
}
// update stats
QmlEventStats *stats = &d->data[event->typeIndex];
stats->duration += event->duration;
if (event->duration < stats->minTime)
stats->minTime = event->duration;
if (event->duration > stats->maxTime)
stats->maxTime = event->duration;
stats->calls++;
// for median computing
durations[event->typeIndex].append(event->duration);
// qml time computation
if (event->startTime > lastEndTime) { // assume parent event if starts before last end
qmlTime += event->duration;
lastEndTime = event->startTime + event->duration;
}
//
// binding loop detection
//
const QmlProfilerDataModel::QmlEventData *potentialParent = callStack.top();
while (potentialParent
&& !(potentialParent->startTime + potentialParent->duration > event->startTime)) {
callStack.pop();
potentialParent = callStack.top();
}
// check whether event is already in stack
for (int ii = 1; ii < callStack.size(); ++ii) {
if (callStack.at(ii)->typeIndex == event->typeIndex) {
d->eventsInBindingLoop.insert(event->typeIndex);
break;
}
}
callStack.push(event);
d->modelManager->modelProxyCountUpdated(d->modelId, i, eventList.count()*2);
}
// post-process: calc mean time, median time, percentoftime
int i = d->data.size();
int total = i * 2;
for (QHash<int, QmlEventStats>::iterator it = d->data.begin(); it != d->data.end(); ++it) {
QmlEventStats* stats = &it.value();
if (stats->calls > 0)
stats->timePerCall = stats->duration / (double)stats->calls;
QVector<qint64> eventDurations = durations[it.key()];
if (!eventDurations.isEmpty()) {
Utils::sort(eventDurations);
stats->medianTime = eventDurations.at(eventDurations.count()/2);
}
stats->percentOfTime = stats->duration * 100.0 / qmlTime;
d->modelManager->modelProxyCountUpdated(d->modelId, i++, total);
}
// set binding loop flag
foreach (int typeIndex, d->eventsInBindingLoop)
d->data[typeIndex].isBindingLoop = true;
// insert root event
QmlEventStats rootEvent;
//.........这里部分代码省略.........
示例13: advance
/*!
\internal
*/
void QDirIteratorPrivate::advance()
{
// Store the current entry
if (!fileEngineIterators.isEmpty())
currentFilePath = fileEngineIterators.top()->currentFilePath();
// Advance to the next entry
if (followNextDir) {
// Start by navigating into the current directory.
followNextDir = false;
QAbstractFileEngineIterator *it = fileEngineIterators.top();
QString subDir = it->currentFilePath();
#ifdef Q_OS_WIN
if (fileInfo.isSymLink())
subDir = fileInfo.canonicalFilePath();
#endif
pushSubDirectory(subDir, it->nameFilters(), it->filters());
}
if (fileEngineIterators.isEmpty())
done = true;
bool foundValidEntry = false;
while (!fileEngineIterators.isEmpty()) {
QAbstractFileEngineIterator *it = fileEngineIterators.top();
// Find the next valid iterator that matches the filters.
foundValidEntry = false;
while (it->hasNext()) {
it->next();
if (matchesFilters(it)) {
foundValidEntry = true;
break;
}
}
if (!foundValidEntry) {
// If this iterator is done, pop and delete it, and continue
// iteration on the parent. Otherwise break, we're done.
if (!fileEngineIterators.isEmpty()) {
delete it;
it = fileEngineIterators.pop();
continue;
}
break;
}
fileInfo = it->currentFileInfo();
// If we're doing flat iteration, we're done.
if (!(iteratorFlags & QDirIterator::Subdirectories))
break;
// Subdirectory iteration.
QString filePath = fileInfo.filePath();
// Never follow . and ..
if (fileInfo.fileName() == QLatin1String(".") || fileInfo.fileName() == QLatin1String(".."))
break;
// Never follow non-directory entries
if (!fileInfo.isDir())
break;
// Check symlinks
if (fileInfo.isSymLink() && !(iteratorFlags & QDirIterator::FollowSymlinks)) {
// Follow symlinks only if FollowSymlinks was passed
break;
}
// Stop link loops
if (visitedLinks.contains(fileInfo.canonicalFilePath()))
break;
// Signal that we want to follow this entry.
followNextDir = true;
break;
}
if (!foundValidEntry)
done = true;
}
示例14: parse
TypeParser::Info TypeParser::parse(const QString &str)
{
Scanner scanner(str);
Info info;
QStack<Info *> stack;
stack.push(&info);
bool colon_prefix = false;
bool in_array = false;
QString array;
Scanner::Token tok = scanner.nextToken();
while (tok != Scanner::NoToken) {
// switch (tok) {
// case Scanner::StarToken: printf(" - *\n"); break;
// case Scanner::AmpersandToken: printf(" - &\n"); break;
// case Scanner::LessThanToken: printf(" - <\n"); break;
// case Scanner::GreaterThanToken: printf(" - >\n"); break;
// case Scanner::ColonToken: printf(" - ::\n"); break;
// case Scanner::CommaToken: printf(" - ,\n"); break;
// case Scanner::ConstToken: printf(" - const\n"); break;
// case Scanner::SquareBegin: printf(" - [\n"); break;
// case Scanner::SquareEnd: printf(" - ]\n"); break;
// case Scanner::Identifier: printf(" - '%s'\n", qPrintable(scanner.identifier())); break;
// default:
// break;
// }
switch (tok) {
case Scanner::StarToken:
++stack.top()->indirections;
break;
case Scanner::AmpersandToken:
stack.top()->is_reference = true;
break;
case Scanner::LessThanToken:
stack.top()->template_instantiations << Info();
stack.push(&stack.top()->template_instantiations.last());
break;
case Scanner::CommaToken:
stack.pop();
stack.top()->template_instantiations << Info();
stack.push(&stack.top()->template_instantiations.last());
break;
case Scanner::GreaterThanToken:
stack.pop();
break;
case Scanner::ColonToken:
colon_prefix = true;
break;
case Scanner::ConstToken:
stack.top()->is_constant = true;
break;
case Scanner::OpenParenToken: // function pointers not supported
case Scanner::CloseParenToken: {
Info i;
i.is_busted = true;
return i;
}
case Scanner::Identifier:
if (in_array) {
array = scanner.identifier();
} else if (colon_prefix || stack.top()->qualified_name.isEmpty()) {
stack.top()->qualified_name << scanner.identifier();
colon_prefix = false;
} else {
stack.top()->qualified_name.last().append(" " + scanner.identifier());
}
break;
case Scanner::SquareBegin:
in_array = true;
break;
case Scanner::SquareEnd:
in_array = false;
stack.top()->arrays += array;
break;
default:
break;
}
tok = scanner.nextToken();
}
return info;
//.........这里部分代码省略.........