void Stone::findPaths(int range,std::unordered_map<int,Stone*>& nodeMap){ int i; for(i=1;i<=range;i++){ findTargets(id,id,i,i,nodeMap); } }
TargetManagement::TargetManagement(vector<LevelObject*> *o, vector<vector<Point*>*> *c, Graph *g, vector<int> *i) { //TODO: Implement targets = new vector<int> (); discovered = new vector<int> (); lastCorners = stack<vector<int> > (); lastPoints = stack<Point*> (); range = vector<Point*> (); objects = o; corners = c; graph = g; info = i; findTargets (); /*for (vector<int>::iterator it = targets->begin(); it != targets->end(); it++) { cout << (*it) << " "; } cout << endl;*/ }
void Stone::findTargets(int pos,int origin,int movesLeft,int range,std::unordered_map<int,Stone*>& nodeMap,std::string path){ if(movesLeft <= 0){ //std::cout << path << std::to_string(pos) << std::endl; pathVector.emplace_back(new Path(pos,range,path + std::to_string(pos))); return; } movesLeft--; int size = nodeMap[pos]->getLinks()->size(); for(int i=0;i < size && nodeMap[pos]->getLinks()->at(i) != 0;i++){ int link = nodeMap[pos]->getLinks()->at(i); if(link != origin){ findTargets(link,pos,movesLeft,range,nodeMap,path + std::to_string(pos) + "-"); } } }
String Symbol::toString(Flags<ToStringFlag> cursorInfoFlags, Flags<Location::ToStringFlag> locationToStringFlags, const std::shared_ptr<Project> &project) const { auto properties = [this]() { List<String> ret; if (isDefinition()) ret << "Definition"; if (isContainer()) ret << "Container"; if ((flags & PureVirtualMethod) == PureVirtualMethod) { ret << "Pure Virtual"; } else if (flags & VirtualMethod) { ret << "Virtual"; } if (flags & ConstMethod) { ret << "Const"; } else if (flags & StaticMethod) { ret << "Static"; } if (flags & Variadic) ret << "Variadic"; if (flags & Auto) ret << "Auto"; if (flags & AutoRef) ret << "AutoRef"; if (flags & MacroExpansion) ret << "MacroExpansion"; if (flags & TemplateSpecialization) ret << "TemplateSpecialization"; if (ret.isEmpty()) return String(); String joined = String::join(ret, ' '); joined += '\n'; return joined; }; List<String> bases; if (project) { extern String findSymbolNameByUsr(const std::shared_ptr<Project> &, const String &, const Location &location); for (const auto &base : baseClasses) { const String symbolName = findSymbolNameByUsr(project, base, location); if (!symbolName.isEmpty()) { bases << symbolName; } } } else { bases = baseClasses; } auto printTypeName = [this]() { String str; if (!typeName.isEmpty()) { str = typeName; } else if (type != CXType_Invalid) { str = RTags::eatString(clang_getTypeKindSpelling(type)); } else { return String(); } return String::format<128>("Type: %s\n", str.constData()); }; String ret = String::format<1024>("SymbolName: %s\n" "Kind: %s\n" "%s" // type "SymbolLength: %u\n" "%s" // range "%s" // enumValue "%s" // linkage "%s" // properties "%s" // usr "%s" // sizeof "%s" // fieldoffset "%s" // baseclasses "%s" // briefComment "%s", // xmlComment symbolName.constData(), kindSpelling().constData(), printTypeName().constData(), symbolLength, startLine != -1 ? String::format<32>("Range: %d:%d-%d:%d\n", startLine, startColumn, endLine, endColumn).constData() : "", #if CINDEX_VERSION_MINOR > 1 kind == CXCursor_EnumConstantDecl ? String::format<32>("Enum Value: %lld\n", enumValue).constData() : #endif "", linkageSpelling(linkage), properties().constData(), usr.isEmpty() ? "" : String::format<64>("Usr: %s\n", usr.constData()).constData(), size > 0 ? String::format<16>("sizeof: %d\n", size).constData() : "", fieldOffset >= 0 ? String::format<32>("field offset (bits/bytes): %d/%d\n", fieldOffset, fieldOffset / 8).constData() : "", alignment >= 0 ? String::format<32>("alignment (bytes): %d\n", alignment).constData() : "", bases.isEmpty() ? "" : String::format<64>("BaseClasses: %s\n", String::join(bases, ", ").constData()).constData(), briefComment.isEmpty() ? "" : String::format<1024>("Brief comment: %s\n", briefComment.constData()).constData(), xmlComment.isEmpty() ? "" : String::format<16384>("Xml comment: %s\n", xmlComment.constData()).constData()); if (!(cursorInfoFlags & IgnoreTargets) && project) { extern Set<Symbol> findTargets(const std::shared_ptr<Project> &, const Symbol &); auto targets = findTargets(project, *this); if (targets.size()) { ret.append("Targets:\n"); auto best = RTags::bestTarget(targets); ret.append(String::format<128>(" %s\n", best.location.toString(locationToStringFlags).constData())); for (const auto &tit : targets) { if (tit.location != best.location) ret.append(String::format<128>(" %s\n", tit.location.toString(locationToStringFlags).constData())); } } } if (!(cursorInfoFlags & IgnoreReferences) && project && !isReference()) { extern Set<Symbol> findCallers(const std::shared_ptr<Project> &, const Symbol &); auto references = findCallers(project, *this); if (references.size()) { ret.append("References:\n"); for (const auto &r : references) { ret.append(String::format<128>(" %s\n", r.location.toString(locationToStringFlags).constData())); } } } return ret; }
void TargetManagement::findTargets () { int ylow; if (discovered -> size () == 0) { ylow = initialTarget (); for (unsigned int j = 0; j < objects -> size (); j++) { discovered -> push_back (0); } } else { ylow = furtherTarget (); } int corner = 0; if (ylow != -1) { targets -> push_back (ylow); discovered -> at (ylow) = 2; // c1-c2-c3-c4 Atvirksciai int count = 0; int currentTarget = targets -> back (); lastCorners.push(vector<int>()); lastCorners.top().push_back(currentTarget); lastCorners.top().push_back (0); lastCorners.top().push_back (0); Point *currentPoint = corners -> at (info->at(currentTarget)) -> at (corner); lastPoints.push(currentPoint); while (count < 4) { //cout << discovered -> at (ylow) << endl; vector<Point*> *recCorners = corners -> at (info->at(currentTarget)); list<int> *g = &(graph -> graph -> at (currentTarget)); vector<Point*> *points = &(graph -> connections -> at (currentTarget)); if (corner == 0) // Goes to 3 { Point *nextCorner = recCorners -> at (3); currentPoint = findNewCorner (recCorners, g, points, currentPoint, nextCorner); if (foundNewTarget(currentTarget)) { currentTarget = lastCorners.top()[0]; corner = setCorner (currentPoint); count = 0; lastCorners.top().push_back (corner); lastCorners.top().push_back(count); } else if (reachedEnd (currentPoint, count)) { corner = 3; count++; lastCorners.top()[1] = corner; lastCorners.top()[2] = count; lastPoints.top() = currentPoint; } else { corner = -1; } } else if (corner == 1) // Goes to 0 { Point *nextCorner = recCorners -> at (0); currentPoint = findNewCorner (recCorners, g, points, currentPoint, nextCorner); if (foundNewTarget(currentTarget)) { currentTarget = lastCorners.top()[0]; corner = setCorner (currentPoint); count = 0; lastCorners.top().push_back (corner); lastCorners.top().push_back(count); } else if (reachedEnd (currentPoint, count)) { corner = 0; count++; lastCorners.top()[1] = corner; lastCorners.top()[2] = count; lastPoints.top() = currentPoint; } else { corner = -1; } } else if (corner == 2) // Goes to 1 { Point *nextCorner = recCorners -> at (1); currentPoint = findNewCorner (recCorners, g, points, currentPoint, nextCorner); if (foundNewTarget(currentTarget)) { currentTarget = lastCorners.top()[0]; corner = setCorner (currentPoint); count = 0; lastCorners.top().push_back (corner); lastCorners.top().push_back(count); } else if (reachedEnd (currentPoint, count)) { corner = 1; count++; lastCorners.top()[1] = corner; lastCorners.top()[2] = count; lastPoints.top() = currentPoint; } else { corner = -1; } } else if (corner == 3) // Goes to 2 { Point *nextCorner = recCorners -> at (2); currentPoint = findNewCorner (recCorners, g, points, currentPoint, nextCorner); if (foundNewTarget(currentTarget)) { currentTarget = lastCorners.top()[0]; corner = setCorner (currentPoint); count = 0; lastCorners.top().push_back (corner); lastCorners.top().push_back(count); } else if (reachedEnd (currentPoint, count)) { corner = 2; count++; lastCorners.top()[1] = corner; lastCorners.top()[2] = count; lastPoints.top() = currentPoint; } else { corner = -1; } } else { lastPoints.pop (); Point *nextCorner = lastPoints.top (); lastPoints.push (currentPoint); currentPoint = findNewCorner (recCorners, g, points, currentPoint, nextCorner); if (foundNewTarget(currentTarget)) { currentTarget = lastCorners.top()[0]; corner = setCorner (currentPoint); count = 0; lastCorners.top().push_back (corner); lastCorners.top().push_back(count); } else { count++; lastCorners.top()[2] = count; lastPoints.top() = currentPoint; } } if (count == 4 && traceConnection ()) { // Roll back searching. if (rollBack ()) { currentTarget = lastCorners.top()[0]; corner = lastCorners.top()[1]; count = lastCorners.top()[2]; currentPoint = lastPoints.top(); //lastPoints.pop (); } } } clearStack (); findTargets (); } }