forked from organicmaps/organicmaps
Adjacency indexes inside cross node records.
This commit is contained in:
parent
fc00ee4d41
commit
a6452b96c0
2 changed files with 71 additions and 38 deletions
|
@ -5,10 +5,9 @@
|
|||
|
||||
namespace routing
|
||||
{
|
||||
|
||||
static uint32_t const g_coordBits = POINT_COORD_BITS;
|
||||
|
||||
void OutgoingCrossNode::Save(Writer &w) const
|
||||
void OutgoingCrossNode::Save(Writer & w) const
|
||||
{
|
||||
uint64_t point = PointToInt64(m_point, g_coordBits);
|
||||
char buff[sizeof(m_nodeId) + sizeof(point) + sizeof(m_outgoingIndex)];
|
||||
|
@ -16,10 +15,9 @@ void OutgoingCrossNode::Save(Writer &w) const
|
|||
*reinterpret_cast<decltype(point) *>(&(buff[sizeof(m_nodeId)])) = point;
|
||||
*reinterpret_cast<decltype(m_outgoingIndex) *>(&(buff[sizeof(m_nodeId) + sizeof(point)])) = m_outgoingIndex;
|
||||
w.Write(buff, sizeof(buff));
|
||||
|
||||
}
|
||||
|
||||
size_t OutgoingCrossNode::Load(const Reader &r, size_t pos)
|
||||
size_t OutgoingCrossNode::Load(const Reader & r, size_t pos, size_t adjacencyIndex)
|
||||
{
|
||||
char buff[sizeof(m_nodeId) + sizeof(uint64_t) + sizeof(m_outgoingIndex)];
|
||||
r.Read(pos, buff, sizeof(buff));
|
||||
|
@ -29,7 +27,7 @@ size_t OutgoingCrossNode::Load(const Reader &r, size_t pos)
|
|||
return pos + sizeof(buff);
|
||||
}
|
||||
|
||||
void IngoingCrossNode::Save(Writer &w) const
|
||||
void IngoingCrossNode::Save(Writer & w) const
|
||||
{
|
||||
uint64_t point = PointToInt64(m_point, g_coordBits);
|
||||
char buff[sizeof(m_nodeId) + sizeof(point)];
|
||||
|
@ -38,16 +36,18 @@ void IngoingCrossNode::Save(Writer &w) const
|
|||
w.Write(buff, sizeof(buff));
|
||||
}
|
||||
|
||||
size_t IngoingCrossNode::Load(const Reader &r, size_t pos)
|
||||
size_t IngoingCrossNode::Load(const Reader & r, size_t pos, size_t adjacencyIndex)
|
||||
{
|
||||
char buff[sizeof(m_nodeId) + sizeof(uint64_t)];
|
||||
r.Read(pos, buff, sizeof(buff));
|
||||
m_nodeId = *reinterpret_cast<decltype(m_nodeId) *>(&buff[0]);
|
||||
m_point = Int64ToPoint(*reinterpret_cast<uint64_t *>(&(buff[sizeof(m_nodeId)])), g_coordBits);
|
||||
m_adjacencyIndex = adjacencyIndex;
|
||||
return pos + sizeof(buff);
|
||||
}
|
||||
|
||||
size_t CrossRoutingContextReader::GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing, OutgoingEdgeIteratorT outgoing) const
|
||||
size_t CrossRoutingContextReader::GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing,
|
||||
OutgoingEdgeIteratorT outgoing) const
|
||||
{
|
||||
size_t ingoing_index = distance(m_ingoingNodes.cbegin(), ingoing);
|
||||
size_t outgoing_index = distance(m_outgoingNodes.cbegin(), outgoing);
|
||||
|
@ -63,11 +63,11 @@ void CrossRoutingContextReader::Load(Reader const & r)
|
|||
uint32_t size;
|
||||
r.Read(pos, &size, sizeof(size));
|
||||
pos += sizeof(size);
|
||||
m_ingoingNodes.resize(size);
|
||||
|
||||
for (auto & node : m_ingoingNodes)
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
pos = node.Load(r, pos);
|
||||
IngoingCrossNode node;
|
||||
pos = node.Load(r, pos, i);
|
||||
m_ingoingIndex.Add(node);
|
||||
}
|
||||
|
||||
|
@ -75,8 +75,8 @@ void CrossRoutingContextReader::Load(Reader const & r)
|
|||
pos += sizeof(size);
|
||||
m_outgoingNodes.resize(size);
|
||||
|
||||
for (auto & node : m_outgoingNodes)
|
||||
pos = node.Load(r, pos);
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
pos = m_outgoingNodes[i].Load(r, pos, i);
|
||||
|
||||
size_t const adjMatrixSize = sizeof(WritedEdgeWeightT) * m_ingoingNodes.size() * m_outgoingNodes.size();
|
||||
mp_reader = unique_ptr<Reader>(r.CreateSubReader(pos, adjMatrixSize));
|
||||
|
@ -96,15 +96,16 @@ void CrossRoutingContextReader::Load(Reader const & r)
|
|||
}
|
||||
}
|
||||
|
||||
bool CrossRoutingContextReader::FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const
|
||||
bool CrossRoutingContextReader::FindIngoingNodeByPoint(m2::PointD const & point,
|
||||
IngoingCrossNode & node) const
|
||||
{
|
||||
bool found = false;
|
||||
m_ingoingIndex.ForEachInRect(MercatorBounds::RectByCenterXYAndSizeInMeters(point, 5),
|
||||
m_ingoingIndex.ForEachInRect(MercatorBounds::RectByCenterXYAndSizeInMeters(point, 5),
|
||||
[&found, &node](IngoingCrossNode const & nd)
|
||||
{
|
||||
node = nd;
|
||||
found = true;
|
||||
});
|
||||
});
|
||||
return found;
|
||||
}
|
||||
|
||||
|
@ -117,12 +118,14 @@ const string & CrossRoutingContextReader::GetOutgoingMwmName(
|
|||
return m_neighborMwmList[outgoingNode.m_outgoingIndex];
|
||||
}
|
||||
|
||||
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> CrossRoutingContextReader::GetIngoingIterators() const
|
||||
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> CrossRoutingContextReader::GetIngoingIterators()
|
||||
const
|
||||
{
|
||||
return make_pair(m_ingoingNodes.cbegin(), m_ingoingNodes.cend());
|
||||
}
|
||||
|
||||
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> CrossRoutingContextReader::GetOutgoingIterators() const
|
||||
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> CrossRoutingContextReader::GetOutgoingIterators()
|
||||
const
|
||||
{
|
||||
return make_pair(m_outgoingNodes.cbegin(), m_outgoingNodes.cend());
|
||||
}
|
||||
|
@ -133,11 +136,13 @@ WritedEdgeWeightT CrossRoutingContextReader::GetAdjacencyCost(IngoingEdgeIterato
|
|||
if (!mp_reader)
|
||||
return INVALID_CONTEXT_EDGE_WEIGHT;
|
||||
WritedEdgeWeightT result;
|
||||
mp_reader->Read(GetIndexInAdjMatrix(ingoing, outgoing) * sizeof(WritedEdgeWeightT), &result, sizeof(WritedEdgeWeightT));
|
||||
mp_reader->Read(GetIndexInAdjMatrix(ingoing, outgoing) * sizeof(WritedEdgeWeightT), &result,
|
||||
sizeof(WritedEdgeWeightT));
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CrossRoutingContextWriter::GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing, OutgoingEdgeIteratorT outgoing) const
|
||||
size_t CrossRoutingContextWriter::GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing,
|
||||
OutgoingEdgeIteratorT outgoing) const
|
||||
{
|
||||
size_t ingoing_index = distance(m_ingoingNodes.cbegin(), ingoing);
|
||||
size_t outgoing_index = distance(m_outgoingNodes.cbegin(), outgoing);
|
||||
|
@ -159,12 +164,12 @@ void CrossRoutingContextWriter::Save(Writer & w) const
|
|||
for (auto const & node : m_outgoingNodes)
|
||||
node.Save(w);
|
||||
|
||||
CHECK(m_adjacencyMatrix.size() == m_outgoingNodes.size()*m_ingoingNodes.size(), ());
|
||||
CHECK(m_adjacencyMatrix.size() == m_outgoingNodes.size() * m_ingoingNodes.size(), ());
|
||||
w.Write(&m_adjacencyMatrix[0], sizeof(m_adjacencyMatrix[0]) * m_adjacencyMatrix.size());
|
||||
|
||||
size = static_cast<uint32_t>(m_neighborMwmList.size());
|
||||
w.Write(&size, sizeof(size));
|
||||
for (string const & neighbor: m_neighborMwmList)
|
||||
for (string const & neighbor : m_neighborMwmList)
|
||||
{
|
||||
size = static_cast<uint32_t>(neighbor.size());
|
||||
w.Write(&size, sizeof(size));
|
||||
|
@ -174,7 +179,7 @@ void CrossRoutingContextWriter::Save(Writer & w) const
|
|||
|
||||
void CrossRoutingContextWriter::AddIngoingNode(WritedNodeID const nodeId, m2::PointD const & point)
|
||||
{
|
||||
m_ingoingNodes.push_back(IngoingCrossNode(nodeId, point));
|
||||
m_ingoingNodes.push_back(IngoingCrossNode(nodeId, point, kInvalidAdjacencyIndex));
|
||||
}
|
||||
|
||||
void CrossRoutingContextWriter::AddOutgoingNode(WritedNodeID const nodeId, string const & targetMwm,
|
||||
|
@ -183,12 +188,14 @@ void CrossRoutingContextWriter::AddOutgoingNode(WritedNodeID const nodeId, strin
|
|||
auto it = find(m_neighborMwmList.begin(), m_neighborMwmList.end(), targetMwm);
|
||||
if (it == m_neighborMwmList.end())
|
||||
it = m_neighborMwmList.insert(m_neighborMwmList.end(), targetMwm);
|
||||
m_outgoingNodes.push_back(OutgoingCrossNode(nodeId, distance(m_neighborMwmList.begin(), it), point));
|
||||
m_outgoingNodes.push_back(OutgoingCrossNode(nodeId, distance(m_neighborMwmList.begin(), it),
|
||||
point, kInvalidAdjacencyIndex));
|
||||
}
|
||||
|
||||
void CrossRoutingContextWriter::ReserveAdjacencyMatrix()
|
||||
{
|
||||
m_adjacencyMatrix.resize(m_ingoingNodes.size() * m_outgoingNodes.size(), INVALID_CONTEXT_EDGE_WEIGHT);
|
||||
m_adjacencyMatrix.resize(m_ingoingNodes.size() * m_outgoingNodes.size(),
|
||||
INVALID_CONTEXT_EDGE_WEIGHT);
|
||||
}
|
||||
|
||||
void CrossRoutingContextWriter::SetAdjacencyCost(IngoingEdgeIteratorT ingoing,
|
||||
|
@ -198,12 +205,14 @@ void CrossRoutingContextWriter::SetAdjacencyCost(IngoingEdgeIteratorT ingoing,
|
|||
m_adjacencyMatrix[GetIndexInAdjMatrix(ingoing, outgoin)] = value;
|
||||
}
|
||||
|
||||
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> CrossRoutingContextWriter::GetIngoingIterators() const
|
||||
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> CrossRoutingContextWriter::GetIngoingIterators()
|
||||
const
|
||||
{
|
||||
return make_pair(m_ingoingNodes.cbegin(), m_ingoingNodes.cend());
|
||||
}
|
||||
|
||||
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> CrossRoutingContextWriter::GetOutgoingIterators() const
|
||||
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> CrossRoutingContextWriter::GetOutgoingIterators()
|
||||
const
|
||||
{
|
||||
return make_pair(m_outgoingNodes.cbegin(), m_outgoingNodes.cend());
|
||||
}
|
||||
|
|
|
@ -11,22 +11,33 @@
|
|||
|
||||
namespace routing
|
||||
{
|
||||
// TODO (ldragunov) Fix this!!!!
|
||||
using WritedNodeID = uint32_t;
|
||||
using WritedEdgeWeightT = uint32_t;
|
||||
static WritedEdgeWeightT const INVALID_CONTEXT_EDGE_WEIGHT = std::numeric_limits<WritedEdgeWeightT>::max();
|
||||
static WritedEdgeWeightT const INVALID_CONTEXT_EDGE_NODE_ID = std::numeric_limits<uint32_t>::max();
|
||||
static size_t constexpr kInvalidAdjacencyIndex = numeric_limits<size_t>::max();
|
||||
|
||||
struct IngoingCrossNode
|
||||
{
|
||||
m2::PointD m_point;
|
||||
WritedNodeID m_nodeId;
|
||||
size_t m_adjacencyIndex;
|
||||
|
||||
IngoingCrossNode() : m_point(m2::PointD::Zero()), m_nodeId(INVALID_CONTEXT_EDGE_NODE_ID) {}
|
||||
IngoingCrossNode(WritedNodeID nodeId, m2::PointD const & point) :m_point(point), m_nodeId(nodeId) {}
|
||||
IngoingCrossNode()
|
||||
: m_point(m2::PointD::Zero())
|
||||
, m_nodeId(INVALID_CONTEXT_EDGE_NODE_ID)
|
||||
, m_adjacencyIndex(kInvalidAdjacencyIndex)
|
||||
{
|
||||
}
|
||||
IngoingCrossNode(WritedNodeID nodeId, m2::PointD const & point, size_t const adjacencyIndex)
|
||||
: m_point(point), m_nodeId(nodeId), m_adjacencyIndex(adjacencyIndex)
|
||||
{
|
||||
}
|
||||
|
||||
void Save(Writer & w) const;
|
||||
|
||||
size_t Load(Reader const & r, size_t pos);
|
||||
size_t Load(Reader const & r, size_t pos, size_t adjacencyIndex);
|
||||
|
||||
m2::RectD const GetLimitRect() const { return m2::RectD(m_point, m_point); }
|
||||
};
|
||||
|
@ -36,15 +47,27 @@ struct OutgoingCrossNode
|
|||
m2::PointD m_point;
|
||||
WritedNodeID m_nodeId;
|
||||
unsigned char m_outgoingIndex;
|
||||
size_t m_adjacencyIndex;
|
||||
|
||||
OutgoingCrossNode() : m_point(m2::PointD::Zero()), m_nodeId(INVALID_CONTEXT_EDGE_NODE_ID), m_outgoingIndex(0) {}
|
||||
OutgoingCrossNode(WritedNodeID nodeId, size_t const index, m2::PointD const & point) : m_point(point),
|
||||
m_nodeId(nodeId),
|
||||
m_outgoingIndex(static_cast<unsigned char>(index)){}
|
||||
OutgoingCrossNode()
|
||||
: m_point(m2::PointD::Zero())
|
||||
, m_nodeId(INVALID_CONTEXT_EDGE_NODE_ID)
|
||||
, m_outgoingIndex(0)
|
||||
, m_adjacencyIndex(kInvalidAdjacencyIndex)
|
||||
{
|
||||
}
|
||||
OutgoingCrossNode(WritedNodeID nodeId, size_t const index, m2::PointD const & point,
|
||||
size_t const adjacencyIndex)
|
||||
: m_point(point)
|
||||
, m_nodeId(nodeId)
|
||||
, m_outgoingIndex(static_cast<unsigned char>(index))
|
||||
, m_adjacencyIndex(adjacencyIndex)
|
||||
{
|
||||
}
|
||||
|
||||
void Save(Writer & w) const;
|
||||
|
||||
size_t Load(Reader const & r, size_t pos);
|
||||
size_t Load(Reader const & r, size_t pos, size_t adjacencyIndex);
|
||||
};
|
||||
|
||||
using IngoingEdgeIteratorT = vector<IngoingCrossNode>::const_iterator;
|
||||
|
@ -53,22 +76,22 @@ using OutgoingEdgeIteratorT = vector<OutgoingCrossNode>::const_iterator;
|
|||
/// Reader class from cross context section in mwm.routing file
|
||||
class CrossRoutingContextReader
|
||||
{
|
||||
vector<IngoingCrossNode> m_ingoingNodes;
|
||||
vector<OutgoingCrossNode> m_outgoingNodes;
|
||||
vector<IngoingCrossNode> m_ingoingNodes;
|
||||
vector<string> m_neighborMwmList;
|
||||
unique_ptr<Reader> mp_reader = nullptr;
|
||||
m4::Tree<IngoingCrossNode> m_ingoingIndex;
|
||||
|
||||
size_t GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing, OutgoingEdgeIteratorT outgoing) const;
|
||||
|
||||
public:
|
||||
public:
|
||||
void Load(Reader const & r);
|
||||
|
||||
const string & GetOutgoingMwmName(OutgoingCrossNode const & mwmIndex) const;
|
||||
|
||||
pair<IngoingEdgeIteratorT, IngoingEdgeIteratorT> GetIngoingIterators() const;
|
||||
|
||||
bool FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const;
|
||||
bool FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const;
|
||||
|
||||
pair<OutgoingEdgeIteratorT, OutgoingEdgeIteratorT> GetOutgoingIterators() const;
|
||||
|
||||
|
@ -91,7 +114,8 @@ public:
|
|||
|
||||
void AddIngoingNode(WritedNodeID const nodeId, m2::PointD const & point);
|
||||
|
||||
void AddOutgoingNode(WritedNodeID const nodeId, string const & targetMwm, m2::PointD const & point);
|
||||
void AddOutgoingNode(WritedNodeID const nodeId, string const & targetMwm,
|
||||
m2::PointD const & point);
|
||||
|
||||
void ReserveAdjacencyMatrix();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue