MeshLib C++ Docs
Loading...
Searching...
No Matches
MRGraph.h
1#pragma once
2
3#include "MRVector.h"
4#include "MRId.h"
5#include "MRBitSet.h"
6#include <cassert>
7#include <functional>
8
9namespace MR
10{
11
13class Graph
14{
15public:
16 using VertId = GraphVertId;
17 using EdgeId = GraphEdgeId;
18
19 using VertBitSet = GraphVertBitSet;
20 using EdgeBitSet = GraphEdgeBitSet;
21
22 using Neighbours = std::vector<EdgeId>; // sorted by edgeID
23 using NeighboursPerVertex = Vector<Neighbours, VertId>;
24
26 {
27 VertId v0, v1; // v0 < v1
28 [[nodiscard]] VertId otherEnd( VertId a ) const
29 {
30 assert( a == v0 || a == v1 );
31 return a == v0 ? v1 : v0;
32 }
33 void replaceEnd( VertId what, VertId with )
34 {
35 assert( what != with );
36 assert( ( v0 == what && v1 != with ) || ( v1 == what && v0 != with ) );
37 if ( v0 == what )
38 v0 = with;
39 else
40 v1 = with;
41 if ( v0 > v1 )
42 std::swap( v0, v1 );
43 }
44 auto operator <=>( const EndVertices& ) const = default;
45 };
47
49 MRMESH_API void construct( NeighboursPerVertex neighboursPerVertex, EndsPerEdge endsPerEdge );
50
52 [[nodiscard]] size_t vertSize() const { return neighboursPerVertex_.size(); }
53
55 [[nodiscard]] const VertBitSet & validVerts() const { return validVerts_; }
56
58 [[nodiscard]] bool valid( VertId v ) const { return validVerts_.test( v ); }
59
61 [[nodiscard]] size_t edgeSize() const { return endsPerEdge_.size(); }
62
64 [[nodiscard]] const EdgeBitSet & validEdges() const { return validEdges_; }
65
67 [[nodiscard]] bool valid( EdgeId e ) const { return validEdges_.test( e ); }
68
70 [[nodiscard]] const Neighbours & neighbours( VertId v ) const { return neighboursPerVertex_[v]; }
71
73 [[nodiscard]] const EndVertices & ends( EdgeId e ) const { return endsPerEdge_[e]; }
74
76 [[nodiscard]] MRMESH_API EdgeId findEdge( VertId a, VertId b ) const;
77
79 [[nodiscard]] bool areNeighbors( VertId a, VertId b ) const { return findEdge( a, b ).valid(); }
80
83 MRMESH_API void merge( VertId remnant, VertId dead, std::function<void( EdgeId remnant, EdgeId dead )> onMergeEdges );
84
86 MRMESH_API bool checkValidity() const;
87
88private:
89 VertBitSet validVerts_;
90 EdgeBitSet validEdges_;
91
92 NeighboursPerVertex neighboursPerVertex_;
93 EndsPerEdge endsPerEdge_;
94};
95
96} //namespace MR
unsafe void construct(MR._ByValue_Vector_StdVectorMRGraphEdgeId_MRGraphVertId neighboursPerVertex, MR._ByValue_Vector_MRGraphEndVertices_MRGraphEdgeId endsPerEdge)
unsafe void merge(MR.GraphVertId remnant, MR.GraphVertId dead, MR.Std._ByValue_Function_VoidFuncFromMRGraphEdgeIdMRGraphEdgeId onMergeEdges)
readonly unsafe bool valid()
Definition MRGraph.h:26