4.3. Simple Type Structs¶
C libraries often define new types for numeric handles, sizes and offsets. To translate these to a VAPI file, just use the SimpleType
attribute with a struct and inherit from the same simple type in the C header.
An example:
typedef uint32_t people_inside;
would be defined in the VAPI file as:
[SimpleType]
[CCode (cname = "people_inside", has_type_id = false)]
public struct PeopleInside : uint32 {
}
When inheriting from an existing type, all the methods will be carried forward. For sizes and offsets, this is probably desirable; for handles, it is probably not. For example, a UNIX file descriptor is stored in an integer, but adding or multiplying two file handles has no sense. In this case, it is preferable not to inherit from a numeric type and add the attribute IntegerType (rank=X)
so the Vala compiler can automatically cast a type into an integer of an appropriate size when needed (e.g., initialising from an integral constant).
An example from XCB:
typedef uint32_t xcb_atom_t;
would be defined in the VAPI file as:
The ranks for the common types, as defined in the glib-2.0.vapi and posix.vapi files, are:
Rank |
Types in glib-2.0 |
Other Use |
---|---|---|
1 |
gint8 gfloat |
|
2 |
gchar gdouble |
|
3 |
guchar guint8 |
Posix.cc_t |
4 |
gshort gint16 |
|
5 |
gushort guint16 |
|
6 |
gint gint32 |
Posixpid_t |
7 |
guint guint32 gunichar |
Posix.speed_t Posix.tcflag_t |
8 |
glong gssize time_t |
Posix.clock_t |
9 |
gulong gsize |
Posix.nfds_t Posix.key_t Posix.fsblkcnt_t Posix.fsfilcnt_t Posix.off_t Posix.uid_t Posix.gid_t Posix.mode_t Posix.dev_t Posix.ino_t Posix.nlink_t Posix.blksize_t Posix.blkcnt_t |
10 |
gint64 |
|
11 |
guint64 |