bool Way::ReadOptimized(const TypeConfig& typeConfig, FileScanner& scanner) { if (!scanner.GetPos(fileOffset)) { return false; } TypeId typeId; scanner.ReadTypeId(typeId, typeConfig.GetWayTypeIdBytes()); TypeInfoRef type=typeConfig.GetWayTypeInfo(typeId); featureValueBuffer.SetType(type); if (!featureValueBuffer.Read(scanner)) { return false; } if (!scanner.Read(nodes)) { return false; } return !scanner.HasError(); }
bool RawNode::Read(const TypeConfig& typeConfig, FileScanner& scanner) { if (!scanner.ReadNumber(id)) { return false; } TypeId typeId; if (!scanner.ReadTypeId(typeId, typeConfig.GetNodeTypeIdBytes())) { return false; } TypeInfoRef type=typeConfig.GetNodeTypeInfo(typeId); featureValueBuffer.SetType(type); if (!type->GetIgnore()) { if (!featureValueBuffer.Read(scanner)) { return false; } } if (!scanner.ReadCoord(coords)) { return false; } return !scanner.HasError(); }
bool Area::ReadOptimized(const TypeConfig& typeConfig, FileScanner& scanner) { if (!scanner.GetPos(fileOffset)) { return false; } TypeId ringType; bool multipleRings; uint32_t ringCount=1; FeatureValueBuffer featureValueBuffer; scanner.ReadTypeId(ringType, typeConfig.GetAreaTypeIdBytes()); TypeInfoRef type=typeConfig.GetAreaTypeInfo(ringType); featureValueBuffer.SetType(type); if (!featureValueBuffer.Read(scanner, multipleRings)) { return false; } if (multipleRings) { if (!scanner.ReadNumber(ringCount)) { return false; } ringCount++; } rings.resize(ringCount); rings[0].featureValueBuffer=featureValueBuffer; if (ringCount>1) { rings[0].ring=masterRingId; } else { rings[0].ring=outerRingId; } if (!scanner.Read(rings[0].nodes)) { return false; } for (size_t i=1; i<ringCount; i++) { scanner.ReadTypeId(ringType, typeConfig.GetAreaTypeIdBytes()); type=typeConfig.GetAreaTypeInfo(ringType); rings[i].SetType(type); if (rings[i].featureValueBuffer.GetType()->GetAreaId()!=typeIgnore) { if (!rings[i].featureValueBuffer.Read(scanner)) { return false; } } scanner.Read(rings[i].ring); if (!scanner.Read(rings[i].nodes)) { return false; } } return !scanner.HasError(); }