Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions core/indigo-core/common/base_cpp/list.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,35 @@ namespace indigo
{
}

List(List<T>&& src) noexcept : _pool(src._pool), _size(src._size), _head(src._head), _tail(src._tail), _own_pool(src._own_pool)
{
src._size = 0;
src._head = -1;
src._tail = -1;
// src still pointing to _pool, but ensure not owning pool
src._own_pool = false;
}

~List()
{
clear();
if (_own_pool)
delete _pool;
}

List<T>& operator=(List<T>&& src) noexcept
{
if (this != &src)
{
std::swap(_pool, src._pool);
std::swap(_size, src._size);
std::swap(_head, src._head);
std::swap(_tail, src._tail);
std::swap(_own_pool, src._own_pool);
}
return *this;
}

int add()
{
if (_size == 0)
Expand Down Expand Up @@ -223,6 +245,7 @@ namespace indigo

private:
List(const List<T>&); // no implicit copy
List<T>& operator=(const List<T>&);
};

} // namespace indigo
Expand Down
28 changes: 17 additions & 11 deletions core/indigo-core/graph/graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
#include "graph/filter.h"
#include "graph/graph_iterators.h"
#include <list>
#include <memory>
#include <vector>

#ifdef _WIN32
#pragma warning(push)
Expand Down Expand Up @@ -133,7 +135,11 @@ namespace indigo
DECL_ERROR;

explicit Graph();
virtual ~Graph();
Graph(Graph&&) noexcept = default;

virtual ~Graph() = default;

Graph& operator=(Graph&&) noexcept = default;

VerticesAuto vertices();

Expand Down Expand Up @@ -164,19 +170,19 @@ namespace indigo

int edgeBegin() const
{
return _edges.begin();
return _edges->begin();
}
int edgeEnd() const
{
return _edges.end();
return _edges->end();
}
int edgeNext(int i) const
{
return _edges.next(i);
return _edges->next(i);
}
int edgeCount() const
{
return _edges.size();
return _edges->size();
}

int addVertex();
Expand Down Expand Up @@ -238,18 +244,18 @@ namespace indigo
protected:
void _mergeWithSubgraph(const Graph& other, const Array<int>& vertices, const Array<int>* edges, Array<int>* mapping, Array<int>* edge_mapping);

Pool<List<VertexEdge>::Elem>* _neighbors_pool;
ObjPool<Vertex>* _vertices;
Pool<Edge> _edges;
std::unique_ptr<Pool<List<VertexEdge>::Elem>> _neighbors_pool;
std::unique_ptr<ObjPool<Vertex>> _vertices;
std::unique_ptr<Pool<Edge>> _edges;

Array<int> _topology; // for each edge: TOPOLOGY_RING, TOPOLOGY_CHAIN, or -1 (not calculated)
bool _topology_valid;

Array<int> _v_smallest_ring_size, _e_smallest_ring_size;
Array<int> _v_sssr_count;
Pool<List<int>::Elem>* _sssr_pool;
ObjArray<List<int>> _sssr_vertices;
ObjArray<List<int>> _sssr_edges;
std::unique_ptr<Pool<List<int>::Elem>> _sssr_pool;
std::vector<List<int>> _sssr_vertices;
std::vector<List<int>> _sssr_edges;
bool _sssr_valid;

Array<int> _component_numbers;
Expand Down
73 changes: 32 additions & 41 deletions core/indigo-core/graph/src/graph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,9 @@ int Vertex::findNeiEdge(int idx) const
IMPL_ERROR(Graph, "graph");

Graph::Graph()
: _neighbors_pool{std::make_unique<Pool<List<VertexEdge>::Elem>>()}, _vertices{std::make_unique<ObjPool<Vertex>>()}, _edges{std::make_unique<Pool<Edge>>()},
_topology_valid{false}, _sssr_pool{}, _sssr_valid{false}, _components_valid{false}, _components_count{0}
{
_vertices = new ObjPool<Vertex>();
_neighbors_pool = new Pool<List<VertexEdge>::Elem>();
_sssr_pool = 0;
_components_valid = false;
}

Graph::~Graph()
{
delete _vertices;
delete _neighbors_pool;
if (_sssr_pool != 0)
{
_sssr_vertices.clear();
_sssr_edges.clear();
delete _sssr_pool;
}
}

int Graph::addVertex()
Expand All @@ -96,7 +82,7 @@ bool Graph::haveEdge(int beg, int end) const

bool Graph::hasEdge(int idx) const
{
return _edges.hasElement(idx);
return _edges->hasElement(idx);
}

bool Graph::hasVertex(int idx) const
Expand All @@ -122,7 +108,7 @@ int Graph::addEdge(int beg, int end)
if (findEdgeIndex(beg, end) != -1)
throw Error("already have edge between vertices %d and %d", beg, end);

int edge_idx = _edges.add();
int edge_idx = _edges->add();

Vertex& vbeg = _vertices->at(beg);
Vertex& vend = _vertices->at(end);
Expand All @@ -138,8 +124,9 @@ int Graph::addEdge(int beg, int end)
ve1.e = edge_idx;
ve2.e = edge_idx;

_edges[edge_idx].beg = beg;
_edges[edge_idx].end = end;
Edge& edge = _edges->at(edge_idx);
edge.beg = beg;
edge.end = end;

_topology_valid = false;
_sssr_valid = false;
Expand All @@ -150,18 +137,18 @@ int Graph::addEdge(int beg, int end)

void Graph::swapEdgeEnds(int edge_idx)
{

std::swap(_edges[edge_idx].beg, _edges[edge_idx].end);
Edge& edge = _edges->at(edge_idx);
std::swap(edge.beg, edge.end);
}

void Graph::removeEdge(int idx)
{
Edge edge = _edges[idx];
Edge& edge = _edges->at(idx);

Vertex& beg = _vertices->at(edge.beg);
Vertex& end = _vertices->at(edge.end);

_edges.remove(idx);
_edges->remove(idx);

beg.neighbors_list.remove(beg.findNeiEdge(idx));
end.neighbors_list.remove(end.findNeiEdge(idx));
Expand All @@ -176,7 +163,7 @@ void Graph::removeAllEdges()
for (int i = _vertices->begin(); i != _vertices->end(); i = _vertices->next(i))
_vertices->at(i).neighbors_list.clear();

_edges.clear();
_edges->clear();
_topology_valid = false;
_sssr_valid = false;
_components_valid = false;
Expand Down Expand Up @@ -212,7 +199,7 @@ const Vertex& Graph::getVertex(int idx) const

const Edge& Graph::getEdge(int idx) const
{
return _edges[idx];
return _edges->at(idx);
}

bool Graph::isConnected(Graph& graph)
Expand Down Expand Up @@ -299,7 +286,7 @@ EdgesAuto Graph::edges()
void Graph::clear()
{
_vertices->clear();
_edges.clear();
_edges->clear();
_topology_valid = false;
_sssr_valid = false;
_components_valid = false;
Expand Down Expand Up @@ -567,9 +554,9 @@ void Graph::_calculateTopology()
SpanningTree spt(*this, 0);
int i;

_topology.clear_resize(_edges.end());
_topology.clear_resize(_edges->end());

for (i = _edges.begin(); i != _edges.end(); i = _edges.next(i))
for (i = _edges->begin(); i != _edges->end(); i = _edges->next(i))
_topology[i] = TOPOLOGY_CHAIN;

spt.markAllEdgesInCycles(_topology.ptr(), TOPOLOGY_RING);
Expand Down Expand Up @@ -621,8 +608,8 @@ void Graph::_calculateSSSRInit()
_e_smallest_ring_size.fffill();
_v_sssr_count.zerofill();

if (_sssr_pool == 0)
_sssr_pool = new Pool<List<int>::Elem>();
if (!_sssr_pool)
_sssr_pool = std::make_unique<Pool<List<int>::Elem>>();

_sssr_vertices.clear();
_sssr_edges.clear();
Expand All @@ -636,8 +623,10 @@ void Graph::_calculateSSSRByCycleBasis(CycleBasis& basis)
{
const Array<int>& cycle = basis.getCycle(i);

List<int>& vertices = _sssr_vertices.push(*_sssr_pool);
List<int>& edges = _sssr_edges.push(*_sssr_pool);
_sssr_vertices.emplace_back(*_sssr_pool);
_sssr_edges.emplace_back(*_sssr_pool);
List<int>& vertices = _sssr_vertices.back();
List<int>& edges = _sssr_edges.back();

_calculateSSSRAddEdgesAndVertices(cycle, edges, vertices);

Expand Down Expand Up @@ -800,30 +789,32 @@ void Graph::_cloneGraph_KeepIndices(const Graph& other)
throw Error("_clone_KeepIndices: internal");

for (i = 0; i <= max_edge_idx; i++)
if (_edges.add() != i)
if (_edges->add() != i)
throw Error("_clone_KeepIndices: unexpected edge index");

i_prev = -1;

for (i = other.edgeBegin(); i != other.edgeEnd(); i = other.edgeNext(i))
{
for (j = i_prev + 1; j < i; j++)
_edges.remove(j);
_edges->remove(j);

_edges[i].beg = other._edges[i].beg;
_edges[i].end = other._edges[i].end;
Edge& edge = _edges->at(i);
Edge& other_edge = other._edges->at(i);
edge.beg = other_edge.beg;
edge.end = other_edge.end;

Vertex& vbeg = _vertices->at(_edges[i].beg);
Vertex& vend = _vertices->at(_edges[i].end);
Vertex& vbeg = _vertices->at(edge.beg);
Vertex& vend = _vertices->at(edge.end);

int ve1_idx = vbeg.neighbors_list.add();
int ve2_idx = vend.neighbors_list.add();

VertexEdge& ve1 = vbeg.neighbors_list[ve1_idx];
VertexEdge& ve2 = vend.neighbors_list[ve2_idx];

ve1.v = _edges[i].end;
ve2.v = _edges[i].beg;
ve1.v = edge.end;
ve2.v = edge.beg;
ve1.e = i;
ve2.e = i;

Expand Down
Loading