1
0
Fork 0

The PathEnumerator now automatically prunes if the getVertex callback returns false

This commit is contained in:
Michael Hackstein 2015-11-27 16:23:13 +01:00
parent 07f772c758
commit e56776bfd5
2 changed files with 14 additions and 7 deletions

View File

@ -51,7 +51,7 @@ static int internalCounter = 0;
static int first = 0;
static int second = 0;
static int third = 0;
auto integerEdgeEnumerator = [] (int& start, std::vector<int>& result, int*& next, size_t&, bool&) {
auto integerEdgeEnumerator = [] (int const& start, std::vector<int>& result, int*& next, size_t&, bool&) {
if (result.size() >= 3) {
next = nullptr;
} else if (next == nullptr) {
@ -105,8 +105,9 @@ auto integerEdgeEnumerator = [] (int& start, std::vector<int>& result, int*& nex
}
};
auto integerVertexEnumerator = [] (int& edge, int& vertex) -> int {
return 1;
auto integerVertexEnumerator = [] (int const& edge, int const& vertex, size_t depth, int& result) -> bool {
result = 1;
return true;
};
// -----------------------------------------------------------------------------

View File

@ -1295,8 +1295,9 @@ namespace triagens {
////////////////////////////////////////////////////////////////////////////////
/// @brief Function to get the connected vertex from index.
/// Returns false if the vertex does not match the filter
////////////////////////////////////////////////////////////////////////////////
std::function<vertexIdentifier (edgeIdentifier&, vertexIdentifier&)> _getVertex;
std::function<bool (edgeIdentifier const&, vertexIdentifier const&, size_t, vertexIdentifier&)> _getVertex;
public:
@ -1305,8 +1306,8 @@ namespace triagens {
// -----------------------------------------------------------------------------
PathEnumerator (
std::function<void(vertexIdentifier&, std::vector<edgeIdentifier>&, edgeItem*&, size_t&, bool&)> getEdge,
std::function<vertexIdentifier (edgeIdentifier&, vertexIdentifier&)> getVertex,
std::function<void(vertexIdentifier const&, std::vector<edgeIdentifier>&, edgeItem*&, size_t&, bool&)> getEdge,
std::function<bool (edgeIdentifier const&, vertexIdentifier const&, size_t, vertexIdentifier&)> getVertex,
vertexIdentifier& startVertex
) : _getEdge(getEdge),
_getVertex(getVertex) {
@ -1341,9 +1342,14 @@ namespace triagens {
_lastEdges.push(nullptr);
_lastEdgesDir.push(false);
_lastEdgesIdx.push(0);
vertexIdentifier v = _getVertex(_enumeratedPath.edges.back(), _enumeratedPath.vertices.back());
vertexIdentifier v;
bool isValid = _getVertex(_enumeratedPath.edges.back(), _enumeratedPath.vertices.back(), _enumeratedPath.vertices.size(), v);
_enumeratedPath.vertices.push_back(v);
TRI_ASSERT(_enumeratedPath.vertices.size() == _enumeratedPath.edges.size() + 1);
if (! isValid) {
prune();
return next();
}
} else {
if (_enumeratedPath.edges.size() == 0) {
// We are done with enumerating paths