MCPcopy Create free account
hub / github.com/comaps/comaps / SerializeTrafficKeys

Method SerializeTrafficKeys

libs/traffic/traffic_info.cpp:224–285  ·  view source on GitHub ↗

static

Source from the content-addressed store, hash-verified

222
223// static
224void TrafficInfo::SerializeTrafficKeys(vector<RoadSegmentId> const & keys, vector<uint8_t> & result)
225{
226 vector<uint32_t> fids;
227 vector<size_t> numSegs;
228 vector<bool> oneWay;
229 for (size_t i = 0; i < keys.size();)
230 {
231 size_t j = i;
232 while (j < keys.size() && keys[i].m_fid == keys[j].m_fid)
233 ++j;
234
235 bool ow = true;
236 for (size_t k = i; k < j; ++k)
237 {
238 if (keys[k].m_dir == RoadSegmentId::kReverseDirection)
239 {
240 ow = false;
241 break;
242 }
243 }
244
245 auto const numDirs = ow ? 1 : 2;
246 size_t numSegsForThisFid = j - i;
247 CHECK_GREATER(numDirs, 0, ());
248 CHECK_EQUAL(numSegsForThisFid % numDirs, 0, ());
249 numSegsForThisFid /= numDirs;
250
251 fids.push_back(keys[i].m_fid);
252 numSegs.push_back(numSegsForThisFid);
253 oneWay.push_back(ow);
254
255 i = j;
256 }
257
258 MemWriter<vector<uint8_t>> memWriter(result);
259 WriteToSink(memWriter, kLatestKeysVersion);
260 WriteVarUint(memWriter, fids.size());
261
262 {
263 BitWriter<decltype(memWriter)> bitWriter(memWriter);
264
265 uint32_t prevFid = 0;
266 for (auto const & fid : fids)
267 {
268 uint64_t const fidDiff = static_cast<uint64_t>(fid - prevFid);
269 bool ok = coding::GammaCoder::Encode(bitWriter, fidDiff + 1);
270 ASSERT(ok, ());
271 UNUSED_VALUE(ok);
272 prevFid = fid;
273 }
274
275 for (auto const & s : numSegs)
276 {
277 bool ok = coding::GammaCoder::Encode(bitWriter, s + 1);
278 ASSERT(ok, ());
279 UNUSED_VALUE(ok);
280 }
281

Callers

nothing calls this directly

Calls 7

WriteToSinkFunction · 0.85
WriteVarUintFunction · 0.85
ASSERTFunction · 0.85
EncodeFunction · 0.50
sizeMethod · 0.45
push_backMethod · 0.45
WriteMethod · 0.45

Tested by

no test coverage detected