static
| 222 | |
| 223 | // static |
| 224 | void 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 |
nothing calls this directly
no test coverage detected