Well, I realized a good way out, which is not too uncomfortable. I basically overload the operator []to access structure fields through characters, for example:
thekeyboard[:forward] = 123
The code:
function offsetof(type_, member::Symbol)
for (i, item) in enumerate(fieldnames(type_))
if item == member
return fieldoffset(type_, i)
end
end
throw("$type_ has no member named $member")
end
function GetStructType(type_, member::Symbol)
for (i, item) in enumerate(fieldnames(type_))
if item == member
return fieldtype(type_, i)
end
end
throw("$type_ has no member named $member")
end
function Base.getindex(ptr::Ptr{T}, s::Symbol) where {T}
address = UInt(ptr)
if address == 0
throw("Base.getindex(Ptr::{$T}) would dereference a NULL pointer")
end
offset = offsetof(T, s)
fieldtype = GetStructType(T, s)
fieldptr = Ptr{fieldtype}(address + offset)
return unsafe_load(fieldptr)
end
function Base.setindex!(ptr::Ptr{T}, value, s::Symbol) where {T}
address = UInt(ptr)
if address == 0
throw("Base.setindex!(Ptr) would write to a NULL pointer")
end
offset = offsetof(T, s)
fieldtype = GetStructType(T, s)
fieldptr = Ptr{fieldtype}(address + offset)
unsafe_store!(fieldptr, value)
return value
end
source
share