Class VariantType
- All Implemented Interfaces:
Proxy
GLib.Variant
type system.
This section introduces the GLib.Variant
type system. It is based, in
large part, on the D-Bus type system, with two major changes and
some minor lifting of restrictions. The
D-Bus specification,
therefore, provides a significant amount of
information that is useful when working with GLib.Variant
.
The first major change with respect to the D-Bus type system is the
introduction of maybe (or ‘nullable’) types. Any type in GLib.Variant
can be converted to a maybe type, in which case, nothing
(or null
)
becomes a valid value. Maybe types have been added by introducing the
character m
to type strings.
The second major change is that the GLib.Variant
type system supports
the concept of ‘indefinite types’ — types that are less specific than
the normal types found in D-Bus. For example, it is possible to speak
of ‘an array of any type’ in GLib.Variant
, where the D-Bus type system
would require you to speak of ‘an array of integers’ or ‘an array of
strings’. Indefinite types have been added by introducing the
characters *
, ?
and r
to type strings.
Finally, all arbitrary restrictions relating to the complexity of types are lifted along with the restriction that dictionary entries may only appear nested inside of arrays.
Just as in D-Bus, GLib.Variant
types are described with strings (‘type
strings’). Subject to the differences mentioned above, these strings
are of the same form as those found in D-Bus. Note, however: D-Bus
always works in terms of messages and therefore individual type
strings appear nowhere in its interface. Instead, ‘signatures’
are a concatenation of the strings of the type of each argument in a
message. GLib.Variant
deals with single values directly so
GLib.Variant
type strings always describe the type of exactly one
value. This means that a D-Bus signature string is generally not a valid
GLib.Variant
type string — except in the case that it is the signature
of a message containing exactly one argument.
An indefinite type is similar in spirit to what may be called an
abstract type in other type systems. No value can exist that has an
indefinite type as its type, but values can exist that have types
that are subtypes of indefinite types. That is to say,
Variant#getType
will never return an indefinite type, but
calling Variant.isOfType(org.gnome.glib.VariantType)
with an indefinite type may return
true. For example, you cannot have a value that represents ‘an
array of no particular type’, but you can have an ‘array of integers’
which certainly matches the type of ‘an array of no particular type’,
since ‘array of integers’ is a subtype of ‘array of no particular
type’.
This is similar to how instances of abstract classes may not
directly exist in other type systems, but instances of their
non-abstract subtypes may. For example, in GTK, no object that has
the type of GtkWidget
can
exist (since GtkWidget
is an abstract class), but a GtkWindow
can certainly be instantiated, and you would say that a GtkWindow
is a
GtkWidget
(since GtkWindow
is a subclass of GtkWidget
).
Two types may not be compared by value; use equal(org.gnome.glib.VariantType)
or isSubtypeOf(org.gnome.glib.VariantType)
May be copied using
copy()
and freed using free()
.
GVariant Type Strings
A GLib.Variant
type string can be any of the following:
- any basic type string (listed below)
v
,r
or*
- one of the characters
a
orm
, followed by another type string - the character
(
, followed by a concatenation of zero or more other type strings, followed by the character)
- the character
{}, followed by a basic type string (see below), followed by another type string, followed by the character {@code }
A basic type string describes a basic type (as per
isBasic()
) and is always a single character in
length. The valid basic type strings are b
, y
, n
, q
, i
, u
, x
,
t
, h
, d
, s
, o
, g
and ?
.
The above definition is recursive to arbitrary depth. aaaaai
and
(ui(nq((y)))s)
are both valid type strings, as is
a(aa(ui)(qna{ya(yd)}))
. In order to not hit memory limits,
GLib.Variant
imposes a limit on recursion depth of 65 nested
containers. This is the limit in the D-Bus specification (64) plus one to
allow a GDBusMessage
to be nested in
a top-level tuple.
The meaning of each of the characters is as follows:
b
: the type string ofG_VARIANT_TYPE_BOOLEAN
; a boolean value.y
: the type string ofG_VARIANT_TYPE_BYTE
; a byte.n
: the type string ofG_VARIANT_TYPE_INT16
; a signed 16 bit integer.q
: the type string ofG_VARIANT_TYPE_UINT16
; an unsigned 16 bit integer.i
: the type string ofG_VARIANT_TYPE_INT32
; a signed 32 bit integer.u
: the type string ofG_VARIANT_TYPE_UINT32
; an unsigned 32 bit integer.x
: the type string ofG_VARIANT_TYPE_INT64
; a signed 64 bit integer.t
: the type string ofG_VARIANT_TYPE_UINT64
; an unsigned 64 bit integer.h
: the type string ofG_VARIANT_TYPE_HANDLE
; a signed 32 bit value that, by convention, is used as an index into an array of file descriptors that are sent alongside a D-Bus message.d
: the type string ofG_VARIANT_TYPE_DOUBLE
; a double precision floating point value.s
: the type string ofG_VARIANT_TYPE_STRING
; a string.o
: the type string ofG_VARIANT_TYPE_OBJECT_PATH
; a string in the form of a D-Bus object path.g
: the type string ofG_VARIANT_TYPE_SIGNATURE
; a string in the form of a D-Bus type signature.?
: the type string ofG_VARIANT_TYPE_BASIC
; an indefinite type that is a supertype of any of the basic types.v
: the type string ofG_VARIANT_TYPE_VARIANT
; a container type that contain any other type of value.a
: used as a prefix on another type string to mean an array of that type; the type stringai
, for example, is the type of an array of signed 32-bit integers.m
: used as a prefix on another type string to mean a ‘maybe’, or ‘nullable’, version of that type; the type stringms
, for example, is the type of a value that maybe contains a string, or maybe contains nothing.()
: used to enclose zero or more other concatenated type strings to create a tuple type; the type string(is)
, for example, is the type of a pair of an integer and a string.r
: the type string ofG_VARIANT_TYPE_TUPLE
; an indefinite type that is a supertype of any tuple type, regardless of the number of items.{}
: used to enclose a basic type string concatenated with another type string to create a dictionary entry type, which usually appears inside of an array to form a dictionary; the type stringa{sd}
, for example, is the type of a dictionary that maps strings to double precision floating point values.
The first type (the basic type) is the key type and the second type is the value type. The reason that the first type is restricted to being a basic type is so that it can easily be hashed.
*
: the type string ofG_VARIANT_TYPE_ANY
; the indefinite type that is a supertype of all types. Note that, as with all type strings, this character represents exactly one type. It cannot be used inside of tuples to mean ‘any number of items’.
Any type string of a container that contains an indefinite type is,
itself, an indefinite type. For example, the type string a*
(corresponding to G_VARIANT_TYPE_ARRAY
) is an indefinite type
that is a supertype of every array type. (*s)
is a supertype
of all tuples that contain exactly two items where the second
item is a string.
a{?*}
is an indefinite type that is a supertype of all arrays
containing dictionary entries where the key is any basic type and
the value is any type at all. This is, by definition, a dictionary,
so this type string corresponds to G_VARIANT_TYPE_DICTIONARY
. Note
that, due to the restriction that the key of a dictionary entry must
be a basic type, {**}
is not a valid type string.
-
Constructor Summary
ConstructorDescriptionVariantType
(MemorySegment address) Create a VariantType proxy instance for the provided memory address.VariantType
(String typeString) Creates a newGVariantType
corresponding to the type string given bytypeString
. -
Method Summary
Modifier and TypeMethodDescriptionstatic VariantType
array
(VariantType element) Constructs the type corresponding to an array of elements of the typetype
.static VariantType
copy()
Makes a copy of aGVariantType
.static VariantType
dictEntry
(VariantType key, VariantType value) Constructs the type corresponding to a dictionary entry with a key of typekey
and a value of typevalue
.Returns a newly-allocated copy of the type string corresponding to this VariantType.element()
Determines the element type of an array or maybe type.boolean
equal
(VariantType type2) Compares this VariantType andtype2
for equality.first()
Determines the first item type of a tuple or dictionary entry type.void
free()
Frees aGVariantType
that was allocated with g_variant_type_copy(), g_variant_type_new() or one of the container type constructor functions.long
Returns the length of the type string corresponding to the given this VariantType.static Type
getType()
Get the GType of the VariantType classint
hash()
Hashes this VariantType.boolean
isArray()
Determines if the given this VariantType is an array type.boolean
isBasic()
Determines if the given this VariantType is a basic type.boolean
Determines if the given this VariantType is a container type.boolean
Determines if the given this VariantType is definite (ie: not indefinite).boolean
Determines if the given this VariantType is a dictionary entry type.boolean
isMaybe()
Determines if the given this VariantType is a maybe type.boolean
isSubtypeOf
(VariantType supertype) Checks if this VariantType is a subtype ofsupertype
.boolean
isTuple()
Determines if the given this VariantType is a tuple type.boolean
Determines if the given this VariantType is the variant type.key()
Determines the key type of a dictionary entry type.static VariantType
maybe
(VariantType element) Constructs the type corresponding to a maybe instance containing typetype
or Nothing.next()
Determines the next item type of a tuple or dictionary entry type.long
nItems()
Determines the number of items contained in a tuple or dictionary entry type.Returns the type string corresponding to the given this VariantType.static long
stringGetDepth
(String typeString) static boolean
stringIsValid
(String typeString) Checks iftypeString
is a valid GVariant type string.static boolean
stringScan
(String string, @Nullable String limit, @Nullable Out<String> endptr) Scan for a single complete and valid GVariant type string instring
.static VariantType
tuple
(VariantType[] items) Constructs a new tuple type, fromitems
.value()
Determines the value type of a dictionary entry type.Methods inherited from class io.github.jwharm.javagi.base.ProxyInstance
equals, handle, hashCode
-
Constructor Details
-
VariantType
Create a VariantType proxy instance for the provided memory address.- Parameters:
address
- the memory address of the native object
-
VariantType
Creates a newGVariantType
corresponding to the type string given bytypeString
. It is appropriate to call g_variant_type_free() on the return value.It is a programmer error to call this function with an invalid type string. Use g_variant_type_string_is_valid() if you are unsure.
- Parameters:
typeString
- a valid GVariant type string
-
-
Method Details
-
getType
-
array
Constructs the type corresponding to an array of elements of the typetype
.It is appropriate to call g_variant_type_free() on the return value.
- Parameters:
element
- aGVariantType
- Returns:
- a new array
GVariantType
Since 2.24
-
dictEntry
Constructs the type corresponding to a dictionary entry with a key of typekey
and a value of typevalue
.It is appropriate to call g_variant_type_free() on the return value.
- Parameters:
key
- a basicGVariantType
value
- aGVariantType
- Returns:
- a new dictionary entry
GVariantType
Since 2.24
-
maybe
Constructs the type corresponding to a maybe instance containing typetype
or Nothing.It is appropriate to call g_variant_type_free() on the return value.
- Parameters:
element
- aGVariantType
- Returns:
- a new maybe
GVariantType
Since 2.24
-
tuple
Constructs a new tuple type, fromitems
.length
is the number of items initems
, or -1 to indicate thatitems
isnull
-terminated.It is appropriate to call g_variant_type_free() on the return value.
- Parameters:
items
- an array ofGVariantTypes
, one for each item- Returns:
- a new tuple
GVariantType
Since 2.24
-
checked
-
stringGetDepth
-
stringIsValid
Checks iftypeString
is a valid GVariant type string. This call is equivalent to calling g_variant_type_string_scan() and confirming that the following character is a nul terminator.- Parameters:
typeString
- a pointer to any string- Returns:
true
iftypeString
is exactly one valid type stringSince 2.24
-
stringScan
public static boolean stringScan(String string, @Nullable @Nullable String limit, @Nullable @Nullable Out<String> endptr) Scan for a single complete and valid GVariant type string instring
. The memory pointed to bylimit
(or bytes beyond it) is never accessed.If a valid type string is found,
endptr
is updated to point to the first character past the end of the string that was found andtrue
is returned.If there is no valid type string starting at
string
, or if the type string does not end beforelimit
thenfalse
is returned.For the simple case of checking if a string is a valid type string, see g_variant_type_string_is_valid().
- Parameters:
string
- a pointer to any stringlimit
- the end ofstring
, ornull
endptr
- location to store the end pointer, ornull
- Returns:
true
if a valid type string was found
-
copy
Makes a copy of aGVariantType
. It is appropriate to call g_variant_type_free() on the return value. this VariantType may not benull
.- Returns:
- a new
GVariantType
Since 2.24
-
dupString
Returns a newly-allocated copy of the type string corresponding to this VariantType. The returned string is nul-terminated. It is appropriate to call g_free() on the return value.- Returns:
- the corresponding type string
Since 2.24
-
element
Determines the element type of an array or maybe type.This function may only be used with array or maybe types.
- Returns:
- the element type of this VariantType
Since 2.24
-
equal
Compares this VariantType andtype2
for equality.Only returns
true
if the types are exactly equal. Even if one type is an indefinite type and the other is a subtype of it,false
will be returned if they are not exactly equal. If you want to check for subtypes, use g_variant_type_is_subtype_of().The argument types of this VariantType and
type2
are onlygconstpointer
to allow use withGHashTable
without function pointer casting. For both arguments, a validGVariantType
must be provided.- Parameters:
type2
- aGVariantType
- Returns:
true
if this VariantType andtype2
are exactly equalSince 2.24
-
first
Determines the first item type of a tuple or dictionary entry type.This function may only be used with tuple or dictionary entry types, but must not be used with the generic tuple type
G_VARIANT_TYPE_TUPLE
.In the case of a dictionary entry type, this returns the type of the key.
null
is returned in case of this VariantType beingG_VARIANT_TYPE_UNIT
.This call, together with g_variant_type_next() provides an iterator interface over tuple and dictionary entry types.
- Returns:
- the first item type of this VariantType, or
null
Since 2.24
-
free
public void free()Frees aGVariantType
that was allocated with g_variant_type_copy(), g_variant_type_new() or one of the container type constructor functions.In the case that this VariantType is
null
, this function does nothing.Since 2.24
-
getStringLength
public long getStringLength()Returns the length of the type string corresponding to the given this VariantType. This function must be used to determine the valid extent of the memory region returned by g_variant_type_peek_string().- Returns:
- the length of the corresponding type string
Since 2.24
-
hash
public int hash()Hashes this VariantType.The argument type of this VariantType is only
gconstpointer
to allow use withGHashTable
without function pointer casting. A validGVariantType
must be provided.- Returns:
- the hash value
Since 2.24
-
isArray
public boolean isArray()Determines if the given this VariantType is an array type. This is true if the type string for this VariantType starts with an 'a'.This function returns
true
for any indefinite type for which every definite subtype is an array type --G_VARIANT_TYPE_ARRAY
, for example.- Returns:
true
if this VariantType is an array typeSince 2.24
-
isBasic
public boolean isBasic()Determines if the given this VariantType is a basic type.Basic types are booleans, bytes, integers, doubles, strings, object paths and signatures.
Only a basic type may be used as the key of a dictionary entry.
This function returns
false
for all indefinite types exceptG_VARIANT_TYPE_BASIC
.- Returns:
true
if this VariantType is a basic typeSince 2.24
-
isContainer
public boolean isContainer()Determines if the given this VariantType is a container type.Container types are any array, maybe, tuple, or dictionary entry types plus the variant type.
This function returns
true
for any indefinite type for which every definite subtype is a container --G_VARIANT_TYPE_ARRAY
, for example.- Returns:
true
if this VariantType is a container typeSince 2.24
-
isDefinite
public boolean isDefinite()Determines if the given this VariantType is definite (ie: not indefinite).A type is definite if its type string does not contain any indefinite type characters ('*', '?', or 'r').
A
GVariant
instance may not have an indefinite type, so calling this function on the result of g_variant_get_type() will always result intrue
being returned. Calling this function on an indefinite type likeG_VARIANT_TYPE_ARRAY
, however, will result infalse
being returned.- Returns:
true
if this VariantType is definiteSince 2.24
-
isDictEntry
public boolean isDictEntry()Determines if the given this VariantType is a dictionary entry type. This is true if the type string for this VariantType starts with a '{'.This function returns
true
for any indefinite type for which every definite subtype is a dictionary entry type --G_VARIANT_TYPE_DICT_ENTRY
, for example.- Returns:
true
if this VariantType is a dictionary entry typeSince 2.24
-
isMaybe
public boolean isMaybe()Determines if the given this VariantType is a maybe type. This is true if the type string for this VariantType starts with an 'm'.This function returns
true
for any indefinite type for which every definite subtype is a maybe type --G_VARIANT_TYPE_MAYBE
, for example.- Returns:
true
if this VariantType is a maybe typeSince 2.24
-
isSubtypeOf
Checks if this VariantType is a subtype ofsupertype
.This function returns
true
if this VariantType is a subtype ofsupertype
. All types are considered to be subtypes of themselves. Aside from that, only indefinite types can have subtypes.- Parameters:
supertype
- aGVariantType
- Returns:
true
if this VariantType is a subtype ofsupertype
Since 2.24
-
isTuple
public boolean isTuple()Determines if the given this VariantType is a tuple type. This is true if the type string for this VariantType starts with a '(' or if this VariantType isG_VARIANT_TYPE_TUPLE
.This function returns
true
for any indefinite type for which every definite subtype is a tuple type --G_VARIANT_TYPE_TUPLE
, for example.- Returns:
true
if this VariantType is a tuple typeSince 2.24
-
isVariant
public boolean isVariant()Determines if the given this VariantType is the variant type.- Returns:
true
if this VariantType is the variant typeSince 2.24
-
key
Determines the key type of a dictionary entry type.This function may only be used with a dictionary entry type. Other than the additional restriction, this call is equivalent to g_variant_type_first().
- Returns:
- the key type of the dictionary entry
Since 2.24
-
nItems
public long nItems()Determines the number of items contained in a tuple or dictionary entry type.This function may only be used with tuple or dictionary entry types, but must not be used with the generic tuple type
G_VARIANT_TYPE_TUPLE
.In the case of a dictionary entry type, this function will always return 2.
- Returns:
- the number of items in this VariantType
Since 2.24
-
next
Determines the next item type of a tuple or dictionary entry type.this VariantType must be the result of a previous call to g_variant_type_first() or g_variant_type_next().
If called on the key type of a dictionary entry then this call returns the value type. If called on the value type of a dictionary entry then this call returns
null
.For tuples,
null
is returned when this VariantType is the last item in a tuple.- Returns:
- the next
GVariantType
after this VariantType, ornull
Since 2.24
-
peekString
Returns the type string corresponding to the given this VariantType. The result is not nul-terminated; in order to determine its length you must call g_variant_type_get_string_length().To get a nul-terminated string, see g_variant_type_dup_string().
- Returns:
- the corresponding type string (not nul-terminated)
Since 2.24
-
value
Determines the value type of a dictionary entry type.This function may only be used with a dictionary entry type.
- Returns:
- the value type of the dictionary entry
Since 2.24
-