Logical operators for ratsnest node filters.

This commit is contained in:
Maciej Suminski 2015-06-05 17:49:00 +02:00
parent 6cc535f27f
commit 16db8e644b
2 changed files with 54 additions and 0 deletions

View File

@ -94,6 +94,18 @@ bool operator!=( const RN_NODE_PTR& aFirst, const RN_NODE_PTR& aSecond )
}
RN_NODE_AND_FILTER operator&&( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 )
{
return RN_NODE_AND_FILTER( aFilter1, aFilter2 );
}
RN_NODE_OR_FILTER operator||( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 )
{
return RN_NODE_OR_FILTER( aFilter1, aFilter2 );
}
static bool isEdgeConnectingNode( const RN_EDGE_PTR& aEdge, const RN_NODE_PTR& aNode )
{
return aEdge->GetSourceNode() == aNode || aEdge->GetTargetNode() == aNode;

View File

@ -71,6 +71,9 @@ typedef boost::shared_ptr<hed::EDGE_MST> RN_EDGE_MST_PTR;
bool operator==( const RN_NODE_PTR& aFirst, const RN_NODE_PTR& aSecond );
bool operator!=( const RN_NODE_PTR& aFirst, const RN_NODE_PTR& aSecond );
struct RN_NODE_OR_FILTER;
struct RN_NODE_AND_FILTER;
///> General interface for filtering out nodes in search functions.
struct RN_NODE_FILTER : public std::unary_function<const RN_NODE_PTR&, bool>
{
@ -80,8 +83,14 @@ struct RN_NODE_FILTER : public std::unary_function<const RN_NODE_PTR&, bool>
{
return true; // By default everything passes
}
friend RN_NODE_AND_FILTER operator&&( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 );
friend RN_NODE_OR_FILTER operator||( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 );
};
RN_NODE_AND_FILTER operator&&( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 );
RN_NODE_OR_FILTER operator||( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 );
///> Filters out nodes that have the flag set.
struct WITHOUT_FLAG : public RN_NODE_FILTER
{
@ -91,6 +100,39 @@ struct WITHOUT_FLAG : public RN_NODE_FILTER
}
};
struct RN_NODE_AND_FILTER : public RN_NODE_FILTER
{
RN_NODE_AND_FILTER( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 ) :
m_filter1( aFilter1 ), m_filter2( aFilter2 )
{}
bool operator()( const RN_NODE_PTR& aNode ) const
{
return m_filter1( aNode ) && m_filter2( aNode );
}
private:
const RN_NODE_FILTER& m_filter1;
const RN_NODE_FILTER& m_filter2;
};
struct RN_NODE_OR_FILTER : public RN_NODE_FILTER
{
RN_NODE_OR_FILTER( const RN_NODE_FILTER& aFilter1, const RN_NODE_FILTER& aFilter2 ) :
m_filter1( aFilter1 ), m_filter2( aFilter2 )
{}
bool operator()( const RN_NODE_PTR& aNode ) const
{
return m_filter1( aNode ) || m_filter2( aNode );
}
private:
const RN_NODE_FILTER& m_filter1;
const RN_NODE_FILTER& m_filter2;
};
///> Functor comparing if two nodes are equal by their coordinates. It is required to make set of
///> shared pointers work properly.
struct RN_NODE_COMPARE : std::binary_function<RN_NODE_PTR, RN_NODE_PTR, bool>