示例#1
0
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);
	}

}
示例#2
0
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;*/
}
示例#3
0
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) + "-");
        }

    }

}
示例#4
0
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;
}
示例#5
0
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 ();
	}
}