Deduplicate foward/reverse geometries
Changes the internal representation of compressed geometries to be a single array shared between forward and reverse geometries that can be read in either direction. Includes a change on extractor::OriginalEdgeData to store via_geometry ids that indicate which direction to read the geometry for that edge based edge. Closes #2592
This commit is contained in:
committed by
Jake Pruitt
parent
73179641b1
commit
a75e16e26b
@@ -8,6 +8,7 @@
|
||||
#include "extractor/external_memory_node.hpp"
|
||||
#include "extractor/guidance/turn_instruction.hpp"
|
||||
#include "extractor/guidance/turn_lane_types.hpp"
|
||||
#include "extractor/original_edge_data.hpp"
|
||||
#include "engine/phantom_node.hpp"
|
||||
#include "util/exception.hpp"
|
||||
#include "util/guidance/bearing_class.hpp"
|
||||
@@ -74,20 +75,22 @@ class BaseDataFacade
|
||||
virtual util::Coordinate GetCoordinateOfNode(const unsigned id) const = 0;
|
||||
virtual OSMNodeID GetOSMNodeIDOfNode(const unsigned id) const = 0;
|
||||
|
||||
virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const = 0;
|
||||
virtual GeometryID GetGeometryIndexForEdgeID(const unsigned id) const = 0;
|
||||
|
||||
virtual void GetUncompressedGeometry(const EdgeID id,
|
||||
std::vector<NodeID> &result_nodes) const = 0;
|
||||
virtual std::vector<NodeID> GetUncompressedForwardGeometry(const EdgeID id) const = 0;
|
||||
|
||||
virtual std::vector<NodeID> GetUncompressedReverseGeometry(const EdgeID id) const = 0;
|
||||
|
||||
// Gets the weight values for each segment in an uncompressed geometry.
|
||||
// Should always be 1 shorter than GetUncompressedGeometry
|
||||
virtual void GetUncompressedWeights(const EdgeID id,
|
||||
std::vector<EdgeWeight> &result_weights) const = 0;
|
||||
virtual std::vector<EdgeWeight> GetUncompressedForwardWeights(const EdgeID id) const = 0;
|
||||
|
||||
virtual std::vector<EdgeWeight> GetUncompressedReverseWeights(const EdgeID id) const = 0;
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights. Will return an empty array when only the base profile is used.
|
||||
virtual void GetUncompressedDatasources(const EdgeID id,
|
||||
std::vector<uint8_t> &data_sources) const = 0;
|
||||
virtual std::vector<uint8_t> GetUncompressedForwardDatasources(const EdgeID id) const = 0;
|
||||
virtual std::vector<uint8_t> GetUncompressedReverseDatasources(const EdgeID id) const = 0;
|
||||
|
||||
// Gets the name of a datasource
|
||||
virtual std::string GetDatasourceName(const uint8_t datasource_name_id) const = 0;
|
||||
|
||||
@@ -76,7 +76,7 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
|
||||
util::ShM<util::Coordinate, false>::vector m_coordinate_list;
|
||||
util::PackedVector<OSMNodeID, false> m_osmnodeid_list;
|
||||
util::ShM<NodeID, false>::vector m_via_node_list;
|
||||
util::ShM<GeometryID, false>::vector m_via_geometry_list;
|
||||
util::ShM<unsigned, false>::vector m_name_ID_list;
|
||||
util::ShM<extractor::guidance::TurnInstruction, false>::vector m_turn_instruction_list;
|
||||
util::ShM<LaneDataID, false>::vector m_lane_data_id;
|
||||
@@ -189,7 +189,7 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
boost::filesystem::ifstream edges_input_stream(edges_file, std::ios::binary);
|
||||
unsigned number_of_edges = 0;
|
||||
edges_input_stream.read((char *)&number_of_edges, sizeof(unsigned));
|
||||
m_via_node_list.resize(number_of_edges);
|
||||
m_via_geometry_list.resize(number_of_edges);
|
||||
m_name_ID_list.resize(number_of_edges);
|
||||
m_turn_instruction_list.resize(number_of_edges);
|
||||
m_lane_data_id.resize(number_of_edges);
|
||||
@@ -201,7 +201,7 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
{
|
||||
edges_input_stream.read((char *)&(current_edge_data),
|
||||
sizeof(extractor::OriginalEdgeData));
|
||||
m_via_node_list[i] = current_edge_data.via_node;
|
||||
m_via_geometry_list[i] = current_edge_data.via_geometry;
|
||||
m_name_ID_list[i] = current_edge_data.name_id;
|
||||
m_turn_instruction_list[i] = current_edge_data.turn_instruction;
|
||||
m_lane_data_id[i] = current_edge_data.lane_data_id;
|
||||
@@ -670,9 +670,9 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
return GetNameForID(name_id + 1);
|
||||
}
|
||||
|
||||
virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const override final
|
||||
virtual GeometryID GetGeometryIndexForEdgeID(const unsigned id) const override final
|
||||
{
|
||||
return m_via_node_list.at(id);
|
||||
return m_via_geometry_list.at(id);
|
||||
}
|
||||
|
||||
virtual std::size_t GetCoreSize() const override final { return m_is_core_node.size(); }
|
||||
@@ -689,47 +689,128 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
}
|
||||
}
|
||||
|
||||
virtual void GetUncompressedGeometry(const EdgeID id,
|
||||
std::vector<NodeID> &result_nodes) const override final
|
||||
virtual std::vector<NodeID> GetUncompressedForwardGeometry(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* NodeID's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector.
|
||||
* */
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_nodes.clear();
|
||||
std::vector<NodeID> result_nodes;
|
||||
|
||||
result_nodes.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.begin() + begin,
|
||||
m_geometry_list.begin() + end,
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_nodes.emplace_back(edge.node_id);
|
||||
});
|
||||
|
||||
return result_nodes;
|
||||
}
|
||||
|
||||
virtual void
|
||||
GetUncompressedWeights(const EdgeID id,
|
||||
std::vector<EdgeWeight> &result_weights) const override final
|
||||
virtual std::vector<NodeID> GetUncompressedReverseGeometry(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* NodeID's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector.
|
||||
* */
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_weights.clear();
|
||||
std::vector<NodeID> result_nodes;
|
||||
|
||||
result_nodes.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.rbegin() + (m_geometry_list.size() - end),
|
||||
m_geometry_list.rbegin() + (m_geometry_list.size() - begin),
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_nodes.emplace_back(edge.node_id);
|
||||
});
|
||||
|
||||
return result_nodes;
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedForwardWeights(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* EdgeWeights's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* forward weights of bi-directional edges, edges 2 to
|
||||
* n of that edge need to be read.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id) + 1;
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
std::vector<EdgeWeight> result_weights;
|
||||
result_weights.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.begin() + begin,
|
||||
m_geometry_list.begin() + end,
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_weights.emplace_back(edge.weight);
|
||||
result_weights.emplace_back(edge.forward_weight);
|
||||
});
|
||||
|
||||
return result_weights;
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedReverseWeights(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* EdgeWeights for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* reverse weights of bi-directional edges, edges 1 to
|
||||
* n-1 of that edge need to be read in reverse.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1) - 1;
|
||||
|
||||
std::vector<EdgeWeight> result_weights;
|
||||
result_weights.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.rbegin() + (m_geometry_list.size() - end),
|
||||
m_geometry_list.rbegin() + (m_geometry_list.size() - begin),
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_weights.emplace_back(edge.reverse_weight);
|
||||
});
|
||||
|
||||
return result_weights;
|
||||
}
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual void
|
||||
GetUncompressedDatasources(const EdgeID id,
|
||||
std::vector<uint8_t> &result_datasources) const override final
|
||||
virtual std::vector<uint8_t>
|
||||
GetUncompressedForwardDatasources(const EdgeID id) const override final
|
||||
{
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
/*
|
||||
* Data sources for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* forward datasources of bi-directional edges, edges 2 to
|
||||
* n of that edge need to be read.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id) + 1;
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_datasources.clear();
|
||||
std::vector<uint8_t> result_datasources;
|
||||
result_datasources.reserve(end - begin);
|
||||
|
||||
// If there was no datasource info, return an array of 0's.
|
||||
@@ -747,6 +828,47 @@ class InternalDataFacade final : public BaseDataFacade
|
||||
m_datasource_list.begin() + end,
|
||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||
}
|
||||
|
||||
return result_datasources;
|
||||
}
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual std::vector<uint8_t>
|
||||
GetUncompressedReverseDatasources(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* Datasources for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* reverse datasources of bi-directional edges, edges 1 to
|
||||
* n-1 of that edge need to be read in reverse.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1) - 1;
|
||||
|
||||
std::vector<uint8_t> result_datasources;
|
||||
result_datasources.reserve(end - begin);
|
||||
|
||||
// If there was no datasource info, return an array of 0's.
|
||||
if (m_datasource_list.empty())
|
||||
{
|
||||
for (unsigned i = 0; i < end - begin; ++i)
|
||||
{
|
||||
result_datasources.push_back(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::for_each(
|
||||
m_datasource_list.rbegin() + (m_datasource_list.size() - end),
|
||||
m_datasource_list.rbegin() + (m_datasource_list.size() - begin),
|
||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||
}
|
||||
|
||||
return result_datasources;
|
||||
}
|
||||
|
||||
virtual std::string GetDatasourceName(const uint8_t datasource_name_id) const override final
|
||||
|
||||
@@ -79,7 +79,7 @@ class SharedDataFacade final : public BaseDataFacade
|
||||
|
||||
util::ShM<util::Coordinate, true>::vector m_coordinate_list;
|
||||
util::PackedVector<OSMNodeID, true> m_osmnodeid_list;
|
||||
util::ShM<NodeID, true>::vector m_via_node_list;
|
||||
util::ShM<GeometryID, true>::vector m_via_geometry_list;
|
||||
util::ShM<unsigned, true>::vector m_name_ID_list;
|
||||
util::ShM<LaneDataID, true>::vector m_lane_data_id;
|
||||
util::ShM<extractor::guidance::TurnInstruction, true>::vector m_turn_instruction_list;
|
||||
@@ -229,11 +229,12 @@ class SharedDataFacade final : public BaseDataFacade
|
||||
|
||||
void LoadViaNodeList()
|
||||
{
|
||||
auto via_node_list_ptr = data_layout->GetBlockPtr<NodeID>(
|
||||
auto via_geometry_list_ptr = data_layout->GetBlockPtr<GeometryID>(
|
||||
shared_memory, storage::SharedDataLayout::VIA_NODE_LIST);
|
||||
util::ShM<NodeID, true>::vector via_node_list(
|
||||
via_node_list_ptr, data_layout->num_entries[storage::SharedDataLayout::VIA_NODE_LIST]);
|
||||
m_via_node_list = std::move(via_node_list);
|
||||
util::ShM<GeometryID, true>::vector via_geometry_list(
|
||||
via_geometry_list_ptr,
|
||||
data_layout->num_entries[storage::SharedDataLayout::VIA_NODE_LIST]);
|
||||
m_via_geometry_list = std::move(via_geometry_list);
|
||||
}
|
||||
|
||||
void LoadNames()
|
||||
@@ -525,40 +526,113 @@ class SharedDataFacade final : public BaseDataFacade
|
||||
return m_osmnodeid_list.at(id);
|
||||
}
|
||||
|
||||
virtual void GetUncompressedGeometry(const EdgeID id,
|
||||
std::vector<NodeID> &result_nodes) const override final
|
||||
virtual std::vector<NodeID> GetUncompressedForwardGeometry(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* NodeID's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* forward geometries of bi-directional edges, edges 2 to
|
||||
* n of that edge need to be read.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_nodes.clear();
|
||||
std::vector<NodeID> result_nodes;
|
||||
|
||||
result_nodes.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.begin() + begin,
|
||||
m_geometry_list.begin() + end,
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_nodes.emplace_back(edge.node_id);
|
||||
});
|
||||
|
||||
return result_nodes;
|
||||
}
|
||||
|
||||
virtual void
|
||||
GetUncompressedWeights(const EdgeID id,
|
||||
std::vector<EdgeWeight> &result_weights) const override final
|
||||
virtual std::vector<NodeID> GetUncompressedReverseGeometry(const EdgeID id) const override final
|
||||
{
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
/*
|
||||
* NodeID's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector.
|
||||
* */
|
||||
const signed begin = m_geometry_indices.at(id);
|
||||
const signed end = m_geometry_indices.at(id + 1);
|
||||
|
||||
std::vector<NodeID> result_nodes;
|
||||
|
||||
result_nodes.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.rbegin() + (m_geometry_list.size() - end),
|
||||
m_geometry_list.rbegin() + (m_geometry_list.size() - begin),
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_nodes.emplace_back(edge.node_id);
|
||||
});
|
||||
|
||||
return result_nodes;
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedForwardWeights(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* EdgeWeights's for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector.
|
||||
* */
|
||||
const unsigned begin = m_geometry_indices.at(id) + 1;
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_weights.clear();
|
||||
std::vector<EdgeWeight> result_weights;
|
||||
result_weights.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.begin() + begin,
|
||||
m_geometry_list.begin() + end,
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_weights.emplace_back(edge.weight);
|
||||
result_weights.emplace_back(edge.forward_weight);
|
||||
});
|
||||
|
||||
return result_weights;
|
||||
}
|
||||
|
||||
virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const override final
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedReverseWeights(const EdgeID id) const override final
|
||||
{
|
||||
return m_via_node_list.at(id);
|
||||
/*
|
||||
* EdgeWeights for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* reverse weights of bi-directional edges, edges 1 to
|
||||
* n-1 of that edge need to be read in reverse.
|
||||
*/
|
||||
const signed begin = m_geometry_indices.at(id);
|
||||
const signed end = m_geometry_indices.at(id + 1) - 1;
|
||||
|
||||
std::vector<EdgeWeight> result_weights;
|
||||
result_weights.reserve(end - begin);
|
||||
|
||||
std::for_each(m_geometry_list.rbegin() + (m_geometry_list.size() - end),
|
||||
m_geometry_list.rbegin() + (m_geometry_list.size() - begin),
|
||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||
result_weights.emplace_back(edge.reverse_weight);
|
||||
});
|
||||
|
||||
return result_weights;
|
||||
}
|
||||
|
||||
virtual GeometryID GetGeometryIndexForEdgeID(const unsigned id) const override final
|
||||
{
|
||||
return m_via_geometry_list.at(id);
|
||||
}
|
||||
|
||||
extractor::guidance::TurnInstruction
|
||||
@@ -755,14 +829,22 @@ class SharedDataFacade final : public BaseDataFacade
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual void
|
||||
GetUncompressedDatasources(const EdgeID id,
|
||||
std::vector<uint8_t> &result_datasources) const override final
|
||||
virtual std::vector<uint8_t>
|
||||
GetUncompressedForwardDatasources(const EdgeID id) const override final
|
||||
{
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
/*
|
||||
* Data sources for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* forward datasources of bi-directional edges, edges 2 to
|
||||
* n of that edge need to be read.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id) + 1;
|
||||
const unsigned end = m_geometry_indices.at(id + 1);
|
||||
|
||||
result_datasources.clear();
|
||||
std::vector<uint8_t> result_datasources;
|
||||
result_datasources.reserve(end - begin);
|
||||
|
||||
// If there was no datasource info, return an array of 0's.
|
||||
@@ -780,6 +862,47 @@ class SharedDataFacade final : public BaseDataFacade
|
||||
m_datasource_list.begin() + end,
|
||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||
}
|
||||
|
||||
return result_datasources;
|
||||
}
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual std::vector<uint8_t>
|
||||
GetUncompressedReverseDatasources(const EdgeID id) const override final
|
||||
{
|
||||
/*
|
||||
* Datasources for geometries are stored in one place for
|
||||
* both forward and reverse segments along the same bi-
|
||||
* directional edge. The m_geometry_indices stores
|
||||
* refences to where to find the beginning of the bi-
|
||||
* directional edge in the m_geometry_list vector. For
|
||||
* reverse datasources of bi-directional edges, edges 1 to
|
||||
* n-1 of that edge need to be read in reverse.
|
||||
*/
|
||||
const unsigned begin = m_geometry_indices.at(id);
|
||||
const unsigned end = m_geometry_indices.at(id + 1) - 1;
|
||||
|
||||
std::vector<uint8_t> result_datasources;
|
||||
result_datasources.reserve(end - begin);
|
||||
|
||||
// If there was no datasource info, return an array of 0's.
|
||||
if (m_datasource_list.empty())
|
||||
{
|
||||
for (unsigned i = 0; i < end - begin; ++i)
|
||||
{
|
||||
result_datasources.push_back(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::for_each(
|
||||
m_datasource_list.rbegin() + (m_datasource_list.size() - end),
|
||||
m_datasource_list.rbegin() + (m_datasource_list.size() - begin),
|
||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||
}
|
||||
|
||||
return result_datasources;
|
||||
}
|
||||
|
||||
virtual std::string GetDatasourceName(const uint8_t datasource_name_id) const override final
|
||||
|
||||
Reference in New Issue
Block a user