@@ -27,26 +27,35 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2727#include < cstddef>
2828#include < deque>
2929#include < vector>
30+ #include < limits>
3031
3132#include " c_types/routes_t.h"
33+ #include " c_types/path_rt.h"
34+ #include " c_types/mst_rt.h"
3235
3336#include " cpp_common/path.hpp"
3437#include " cpp_common/alloc.hpp"
3538#include " cpp_common/assert.hpp"
3639
3740namespace {
3841
42+ double
43+ to_inf (double value) {
44+ return std::fabs (value - (std::numeric_limits<double >::max)()) < 1 ?
45+ std::numeric_limits<double >::infinity () : value;
46+ }
47+
3948void
4049get_path (
4150 int route_id,
4251 int path_id,
4352 const pgrouting::Path &path,
44- Routes_t **postgres_data ,
53+ Routes_t **tuples ,
4554 double &route_agg_cost,
4655 size_t &sequence) {
4756 int path_seq = 0 ;
4857 for (const auto e : path) {
49- (*postgres_data )[sequence] = {
58+ (*tuples )[sequence] = {
5059 route_id,
5160 path_id,
5261 path_seq,
@@ -63,6 +72,45 @@ get_path(
6372 }
6473}
6574
75+ void get_path (
76+ const pgrouting::Path &path,
77+ Path_rt* &tuples,
78+ size_t &sequence) {
79+ double prev_cost = 0 ;
80+ double aggcost = path.size () == 1 ? path[0 ].agg_cost : 0 ;
81+ for (const auto e : path) {
82+ aggcost += prev_cost;
83+ tuples[sequence] = {
84+ path.start_id (),
85+ path.end_id (),
86+ e.node ,
87+ e.edge ,
88+ to_inf (e.cost ),
89+ to_inf (aggcost)
90+ };
91+ prev_cost = e.cost ;
92+ sequence++;
93+ }
94+ }
95+
96+ void get_path (
97+ const pgrouting::Path &path,
98+ MST_rt* &tuples,
99+ size_t &sequence) {
100+ for (const auto e : path) {
101+ tuples[sequence] = {
102+ path.start_id (),
103+ 0 ,
104+ e.pred ,
105+ e.node ,
106+ e.edge ,
107+ to_inf (e.cost ),
108+ to_inf (e.agg_cost )};
109+ ++sequence;
110+ }
111+ }
112+
113+
66114} // namespace
67115
68116namespace pgrouting {
@@ -134,5 +182,46 @@ get_viaRoute(
134182 return sequence;
135183}
136184
185+ size_t
186+ get_tuples (
187+ const std::deque<pgrouting::Path> &paths,
188+ Path_rt* &tuples) {
189+ pgassert (!tuples);
190+
191+ auto count = count_tuples (paths);
192+ if (count == 0 ) return 0 ;
193+
194+ tuples = pgr_alloc (count, tuples);
195+
196+ size_t sequence = 0 ;
197+ for (const auto &path : paths) {
198+ if (path.size () > 0 ) {
199+ ::get_path (path, tuples, sequence);
200+ }
201+ }
202+ return sequence;
203+ }
204+
205+
206+ size_t
207+ get_tuples (
208+ const std::deque<pgrouting::Path> &paths,
209+ MST_rt* &tuples) {
210+ pgassert (!tuples);
211+
212+ auto count = count_tuples (paths);
213+ if (count == 0 ) return 0 ;
214+
215+ tuples = pgr_alloc (count, tuples);
216+
217+ size_t sequence = 0 ;
218+ for (const Path &path : paths) {
219+ if (path.size () > 0 ) {
220+ ::get_path (path, tuples, sequence);
221+ }
222+ }
223+ return sequence;
224+ }
225+
137226} // namespace to_postgres
138227} // namespace pgrouting
0 commit comments