diff --git a/src/OSMPBF.jl b/src/OSMPBF.jl index d903923..1c03b63 100644 --- a/src/OSMPBF.jl +++ b/src/OSMPBF.jl @@ -1,6 +1,21 @@ -# Automatically generated by ProtoBuf.jl +# Modified from the file automatically generated by ProtoBuf.jl +# See https://github.com/pszufe/OpenStreetMapX.jl/pull/52/ module OSMPBF const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) + + using ProtoBuf + abstract type SimpleProtoType <: ProtoType end + set_defaults!(::SimpleProtoType) = nothing + function ProtoBuf.clear(obj::SimpleProtoType) + # FIXME how does it play with GC ? + Base.unsafe_securezero!(pointer_from_objref(obj), sizeof(typeof(obj))) + set_defaults!(obj) + return + end + Base.hasproperty(obj::SimpleProtoType, field::Symbol) = isdefined(obj, field) + Base.setproperty!(obj::SimpleProtoType, field::Symbol, value) = setfield!(obj, field, value) + ProtoBuf.setdefaultproperties!(::SimpleProtoType, ::ProtoMeta) = nothing + include("fileformat_pb.jl") include("osmformat_pb.jl") end diff --git a/src/fileformat_pb.jl b/src/fileformat_pb.jl index 5e721cb..45d3028 100644 --- a/src/fileformat_pb.jl +++ b/src/fileformat_pb.jl @@ -1,26 +1,19 @@ -# Automatically generated by ProtoBuf.jl +# Modified from the file automatically generated by ProtoBuf.jl +# See https://github.com/pszufe/OpenStreetMapX.jl/pull/52/ # syntax: proto2 using ProtoBuf import ProtoBuf.meta -mutable struct Blob <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Blob(; kwargs...) - obj = new(meta(Blob), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct Blob <: SimpleProtoType + raw_size::Int32 + raw::Vector{UInt8} + zlib_data::Vector{UInt8} + lzma_data::Vector{UInt8} + OBSOLETE_bzip2_data::Vector{UInt8} + lz4_data::Vector{UInt8} + zstd_data::Vector{UInt8} + function Blob() + return new() end end # mutable struct Blob const __meta_Blob = Ref{ProtoMeta}() @@ -37,44 +30,13 @@ function meta(::Type{Blob}) __meta_Blob[] end end -function Base.getproperty(obj::Blob, name::Symbol) - if name === :raw_size - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :raw - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :zlib_data - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :lzma_data - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :OBSOLETE_bzip2_data - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :lz4_data - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :zstd_data - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end -mutable struct BlobHeader <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function BlobHeader(; kwargs...) - obj = new(meta(BlobHeader), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct BlobHeader <: SimpleProtoType + _type::AbstractString + indexdata::Vector{UInt8} + datasize::Int32 + function BlobHeader() + return new() end end # mutable struct BlobHeader const __meta_BlobHeader = Ref{ProtoMeta}() @@ -89,16 +51,5 @@ function meta(::Type{BlobHeader}) __meta_BlobHeader[] end end -function Base.getproperty(obj::BlobHeader, name::Symbol) - if name === :_type - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :indexdata - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :datasize - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end export Blob, BlobHeader diff --git a/src/osmformat_pb.jl b/src/osmformat_pb.jl index 7cb5249..7969caf 100644 --- a/src/osmformat_pb.jl +++ b/src/osmformat_pb.jl @@ -1,28 +1,19 @@ -# Automatically generated by ProtoBuf.jl +# Modified from the file automatically generated by ProtoBuf.jl +# See https://github.com/pszufe/OpenStreetMapX.jl/pull/52/ # syntax: proto2 using ProtoBuf import ProtoBuf.meta -mutable struct HeaderBBox <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HeaderBBox(; kwargs...) - obj = new(meta(HeaderBBox), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct HeaderBBox <: SimpleProtoType + left::Int64 + right::Int64 + top::Int64 + bottom::Int64 + function HeaderBBox() + return new() end -end # mutable struct HeaderBBox +end + const __meta_HeaderBBox = Ref{ProtoMeta}() function meta(::Type{HeaderBBox}) ProtoBuf.metalock() do @@ -36,40 +27,31 @@ function meta(::Type{HeaderBBox}) __meta_HeaderBBox[] end end -function Base.getproperty(obj::HeaderBBox, name::Symbol) - if name === :left - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :right - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :top - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :bottom - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end -mutable struct HeaderBlock <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} +# TODO which subtype of `AbstractString` is actually used ? +mutable struct HeaderBlock <: SimpleProtoType + bbox::HeaderBBox + required_features::Vector{AbstractString} + optional_features::Vector{AbstractString} + writingprogram::AbstractString + source::AbstractString + osmosis_replication_timestamp::Int64 + osmosis_replication_sequence_number::Int64 + osmosis_replication_base_url::AbstractString - function HeaderBlock(; kwargs...) - obj = new(meta(HeaderBlock), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj + function HeaderBlock() + return new() end end # mutable struct HeaderBlock +#function ProtoBuf.clear(obj::HeaderBlock) +# if isdefined(obj, :required_features) +# empty!(obj.required_features) +# end +# if isdefined(obj, :optional_features) +# empty!(obj.optional_features) +# end +# return +#end const __meta_HeaderBlock = Ref{ProtoMeta}() function meta(::Type{HeaderBlock}) ProtoBuf.metalock() do @@ -82,48 +64,19 @@ function meta(::Type{HeaderBlock}) __meta_HeaderBlock[] end end -function Base.getproperty(obj::HeaderBlock, name::Symbol) - if name === :bbox - return (obj.__protobuf_jl_internal_values[name])::HeaderBBox - elseif name === :required_features - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :optional_features - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :writingprogram - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :source - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :osmosis_replication_timestamp - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :osmosis_replication_sequence_number - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :osmosis_replication_base_url - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct StringTable <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - function StringTable(; kwargs...) - obj = new(meta(StringTable), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct StringTable <: SimpleProtoType + s::Vector{Vector{UInt8}} + function StringTable() + return new() end end # mutable struct StringTable +#function ProtoBuf.clear(obj::StringTable) +# if isdefined(obj, :s) +# empty!(obj.s) +# end +# return +#end const __meta_StringTable = Ref{ProtoMeta}() function meta(::Type{StringTable}) ProtoBuf.metalock() do @@ -135,34 +88,24 @@ function meta(::Type{StringTable}) __meta_StringTable[] end end -function Base.getproperty(obj::StringTable, name::Symbol) - if name === :s - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Vector{UInt8}} - else - getfield(obj, name) - end -end -mutable struct Info <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Info(; kwargs...) - obj = new(meta(Info), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct Info <: SimpleProtoType + version::Int32 + timestamp::Int64 + changeset::Int64 + uid::Int32 + user_sid::UInt32 + visible::Bool + function Info() + obj = new() + set_defaults!(obj) + return obj end end # mutable struct Info +function set_defaults!(obj::Info) + obj.version = Int32(-1) + return +end const __meta_Info = Ref{ProtoMeta}() function meta(::Type{Info}) ProtoBuf.metalock() do @@ -175,42 +118,16 @@ function meta(::Type{Info}) __meta_Info[] end end -function Base.getproperty(obj::Info, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :timestamp - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :changeset - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :uid - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :user_sid - return (obj.__protobuf_jl_internal_values[name])::UInt32 - elseif name === :visible - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct DenseInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - function DenseInfo(; kwargs...) - obj = new(meta(DenseInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct DenseInfo <: SimpleProtoType + version::Vector{Int32} + timestamp::Vector{Int64} + changeset::Vector{Int64} + uid::Vector{Int32} + user_sid::Vector{Int32} + visible::Vector{Bool} + function DenseInfo() + return new() end end # mutable struct DenseInfo const __meta_DenseInfo = Ref{ProtoMeta}() @@ -226,42 +143,11 @@ function meta(::Type{DenseInfo}) __meta_DenseInfo[] end end -function Base.getproperty(obj::DenseInfo, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :timestamp - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :changeset - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :uid - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :user_sid - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :visible - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Bool} - else - getfield(obj, name) - end -end - -mutable struct ChangeSet <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - function ChangeSet(; kwargs...) - obj = new(meta(ChangeSet), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct ChangeSet <: SimpleProtoType + id::Int64 + function ChangeSet() + return new() end end # mutable struct ChangeSet const __meta_ChangeSet = Ref{ProtoMeta}() @@ -276,32 +162,16 @@ function meta(::Type{ChangeSet}) __meta_ChangeSet[] end end -function Base.getproperty(obj::ChangeSet, name::Symbol) - if name === :id - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end -mutable struct Node <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Node(; kwargs...) - obj = new(meta(Node), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct Node <: SimpleProtoType + id::Int64 + keys::Vector{UInt32} + vals::Vector{UInt32} + info::Info + lat::Int64 + lon::Int64 + function Node() + return new() end end # mutable struct Node const __meta_Node = Ref{ProtoMeta}() @@ -319,42 +189,15 @@ function meta(::Type{Node}) __meta_Node[] end end -function Base.getproperty(obj::Node, name::Symbol) - if name === :id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :keys - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :vals - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :info - return (obj.__protobuf_jl_internal_values[name])::Info - elseif name === :lat - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :lon - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end -mutable struct DenseNodes <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DenseNodes(; kwargs...) - obj = new(meta(DenseNodes), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct DenseNodes <: SimpleProtoType + id::Vector{Int64} + denseinfo::DenseInfo + lat::Vector{Int64} + lon::Vector{Int64} + keys_vals::Vector{Int32} + function DenseNodes() + return new() end end # mutable struct DenseNodes const __meta_DenseNodes = Ref{ProtoMeta}() @@ -371,42 +214,23 @@ function meta(::Type{DenseNodes}) __meta_DenseNodes[] end end -function Base.getproperty(obj::DenseNodes, name::Symbol) - if name === :id - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :denseinfo - return (obj.__protobuf_jl_internal_values[name])::DenseInfo - elseif name === :lat - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :lon - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :keys_vals - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - else - getfield(obj, name) - end -end - -mutable struct Way <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - function Way(; kwargs...) - obj = new(meta(Way), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct Way <: SimpleProtoType + id::Int64 + keys::Vector{UInt32} + vals::Vector{UInt32} + info::Info + refs::Vector{Int64} + lat::Vector{Int64} + lon::Vector{Int64} + function Way() + return new() end end # mutable struct Way +#function set_defaults!(obj::Way) +# obj.keys = UInt32[] +# obj.vals = UInt32[] +#end const __meta_Way = Ref{ProtoMeta}() function meta(::Type{Way}) ProtoBuf.metalock() do @@ -422,52 +246,22 @@ function meta(::Type{Way}) __meta_Way[] end end -function Base.getproperty(obj::Way, name::Symbol) - if name === :id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :keys - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :vals - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :info - return (obj.__protobuf_jl_internal_values[name])::Info - elseif name === :refs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :lat - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :lon - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - else - getfield(obj, name) - end -end - -const Relation_MemberType = (;[ - Symbol("NODE") => Int32(0), - Symbol("WAY") => Int32(1), - Symbol("RELATION") => Int32(2), -]...) -mutable struct Relation <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} +const Relation_MemberType = ["NODE", "WAY", "RELATION"] - function Relation(; kwargs...) - obj = new(meta(Relation), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct Relation <: SimpleProtoType + id::Int64 + keys::Vector{UInt32} + vals::Vector{UInt32} + info::Info + roles_sid::Vector{Int32} + memids::Vector{Int64} + types::Vector{Int32} + function Relation() + return new() end end # mutable struct Relation + const __meta_Relation = Ref{ProtoMeta}() function meta(::Type{Relation}) ProtoBuf.metalock() do @@ -483,44 +277,15 @@ function meta(::Type{Relation}) __meta_Relation[] end end -function Base.getproperty(obj::Relation, name::Symbol) - if name === :id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :keys - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :vals - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :info - return (obj.__protobuf_jl_internal_values[name])::Info - elseif name === :roles_sid - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :memids - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :types - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - else - getfield(obj, name) - end -end -mutable struct PrimitiveGroup <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function PrimitiveGroup(; kwargs...) - obj = new(meta(PrimitiveGroup), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct PrimitiveGroup <: SimpleProtoType + nodes::Vector{Node} + dense::DenseNodes + ways::Vector{Way} + relations::Vector{Relation} + changesets::Vector{ChangeSet} + function PrimitiveGroup() + return new() end end # mutable struct PrimitiveGroup const __meta_PrimitiveGroup = Ref{ProtoMeta}() @@ -534,42 +299,36 @@ function meta(::Type{PrimitiveGroup}) __meta_PrimitiveGroup[] end end -function Base.getproperty(obj::PrimitiveGroup, name::Symbol) - if name === :nodes - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Node} - elseif name === :dense - return (obj.__protobuf_jl_internal_values[name])::DenseNodes - elseif name === :ways - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Way} - elseif name === :relations - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Relation} - elseif name === :changesets - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ChangeSet} - else - getfield(obj, name) - end -end - -mutable struct PrimitiveBlock <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - function PrimitiveBlock(; kwargs...) - obj = new(meta(PrimitiveBlock), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - if fldval !== nothing - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - end - obj +mutable struct PrimitiveBlock <: SimpleProtoType + stringtable::StringTable + primitivegroup::Vector{PrimitiveGroup} + granularity::Int32 + lat_offset::Int64 + lon_offset::Int64 + date_granularity::Int32 + function PrimitiveBlock() + obj = new() + set_defaults!(obj) + return obj end end # mutable struct PrimitiveBlock +function set_defaults!(obj::PrimitiveBlock) + obj.granularity = Int32(100) + obj.lat_offset = 0 + obj.lon_offset = 0 + obj.date_granularity = Int32(1000) + return +end +#function ProtoBuf.clear(obj::PrimitiveBlock) +# if isdefined(obj, :stringtable) +# ProtoBuf.clear(obj.stringtable) +# end +# if isdefined(obj, :primitivegroup) +# empty!(obj.primitivegroup) +# end +# return +#end const __meta_PrimitiveBlock = Ref{ProtoMeta}() function meta(::Type{PrimitiveBlock}) ProtoBuf.metalock() do @@ -584,22 +343,5 @@ function meta(::Type{PrimitiveBlock}) __meta_PrimitiveBlock[] end end -function Base.getproperty(obj::PrimitiveBlock, name::Symbol) - if name === :stringtable - return (obj.__protobuf_jl_internal_values[name])::StringTable - elseif name === :primitivegroup - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{PrimitiveGroup} - elseif name === :granularity - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :lat_offset - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :lon_offset - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :date_granularity - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end export HeaderBlock, HeaderBBox, PrimitiveBlock, PrimitiveGroup, StringTable, Info, DenseInfo, ChangeSet, Node, DenseNodes, Way, Relation_MemberType, Relation diff --git a/src/pbf.jl b/src/pbf.jl index dd9dc0d..cf8df3f 100644 --- a/src/pbf.jl +++ b/src/pbf.jl @@ -82,17 +82,17 @@ function process_element(osm, pbf_way::OSMPBF.Way, table, lat_offset, lon_offset refs = pbf_way.refs cumsum!(refs, refs) way.nodes = refs - keys = pbf_way.keys - vals = pbf_way.vals - for i in eachindex(keys) - tag(osm, way, table, keys[i], vals[i]) + if isdefined(pbf_way, :keys) + keys = pbf_way.keys + vals = pbf_way.vals + for i in eachindex(keys) + tag(osm, way, table, keys[i], vals[i]) + end end push!(osm.ways, way) return end -const MEMBER_TYPE = ["NODE", "WAY", "RELATION"] - function process_element(osm, pbf_relation::OSMPBF.Relation, table, lat_offset, lon_offset, granularity) relation = Relation(pbf_relation.id) memids = pbf_relation.memids @@ -100,14 +100,16 @@ function process_element(osm, pbf_relation::OSMPBF.Relation, table, lat_offset, types = pbf_relation.types for i in eachindex(types) push!(relation.members, Dict( - "type" => MEMBER_TYPE[types[i] + 1], + "type" => OSMPBF.Relation_MemberType[types[i] + 1], "ref" => string(memids[i]), )) end - keys = pbf_relation.keys - vals = pbf_relation.vals - for i in eachindex(keys) - tag(osm, relation, table, keys[i], vals[i]) + if isdefined(pbf_relation, :keys) + keys = pbf_relation.keys + vals = pbf_relation.vals + for i in eachindex(keys) + tag(osm, relation, table, keys[i], vals[i]) + end end push!(osm.relations, relation) return @@ -125,8 +127,10 @@ function process_block(osm, block::OSMPBF.PrimitiveBlock) lat_offset = block.lat_offset lon_offset = block.lon_offset for group in block.primitivegroup - for key in keys(group.__protobuf_jl_internal_values) - process_elements(osm, getproperty(group, key), table, lat_offset, lon_offset, granularity) + for key in fieldnames(OSMPBF.PrimitiveGroup) + if isdefined(group, key) + process_elements(osm, getproperty(group, key), table, lat_offset, lon_offset, granularity) + end end end end