mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-23 22:16:16 +01:00
Add and use G_SIZEOF_MEMBER() macro
A convenient macro present in the Linux kernel, named FIELD_SIZE() there. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
fda1c651d5
commit
fd61a21ecd
@ -424,6 +424,7 @@ CLAMP
|
||||
G_APPROX_VALUE
|
||||
|
||||
<SUBSECTION>
|
||||
G_SIZEOF_MEMBER
|
||||
G_STRUCT_MEMBER
|
||||
G_STRUCT_MEMBER_P
|
||||
G_STRUCT_OFFSET
|
||||
|
@ -224,9 +224,9 @@ g_local_file_output_stream_write (GOutputStream *stream,
|
||||
#ifdef G_OS_UNIX
|
||||
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
||||
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
||||
sizeof ((struct iovec *) 0)->iov_base == sizeof ((GOutputVector *) 0)->buffer && \
|
||||
G_SIZEOF_MEMBER (struct iovec, iov_base) == G_SIZEOF_MEMBER (GOutputVector, buffer) && \
|
||||
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
||||
sizeof ((struct iovec *) 0)->iov_len == sizeof((GOutputVector *) 0)->size && \
|
||||
G_SIZEOF_MEMBER (struct iovec, iov_len) == G_SIZEOF_MEMBER (GOutputVector, size) && \
|
||||
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
||||
|
||||
static gboolean
|
||||
|
@ -403,9 +403,9 @@ g_unix_output_stream_write (GOutputStream *stream,
|
||||
|
||||
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
||||
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
||||
sizeof ((struct iovec *) 0)->iov_base == sizeof ((GOutputVector *) 0)->buffer && \
|
||||
G_SIZEOF_MEMBER (struct iovec, iov_base) == G_SIZEOF_MEMBER (GOutputVector, buffer) && \
|
||||
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
||||
sizeof ((struct iovec *) 0)->iov_len == sizeof((GOutputVector *) 0)->size && \
|
||||
G_SIZEOF_MEMBER (struct iovec, iov_len) == G_SIZEOF_MEMBER (GOutputVector, size) && \
|
||||
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
||||
|
||||
static gboolean
|
||||
|
@ -67,7 +67,7 @@ enum
|
||||
};
|
||||
|
||||
#ifndef UNIX_PATH_MAX
|
||||
#define UNIX_PATH_MAX sizeof (((struct sockaddr_un *) 0)->sun_path)
|
||||
#define UNIX_PATH_MAX G_SIZEOF_MEMBER (struct sockaddr_un, sun_path)
|
||||
#endif
|
||||
|
||||
struct _GUnixSocketAddressPrivate
|
||||
|
@ -1096,4 +1096,18 @@
|
||||
|
||||
#endif /* __GI_SCANNER__ */
|
||||
|
||||
/**
|
||||
* G_SIZEOF_MEMBER:
|
||||
* @struct_type: a structure type, e.g. #GOutputVector
|
||||
* @member: a field in the structure, e.g. `size`
|
||||
*
|
||||
* Returns: the size of @member in the struct definition without having a
|
||||
* declared instance of @struct_type.
|
||||
*
|
||||
* Since: 2.64
|
||||
*/
|
||||
#define G_SIZEOF_MEMBER(struct_type, member) \
|
||||
GLIB_AVAILABLE_MACRO_IN_2_64 \
|
||||
sizeof (((struct_type *) 0)->member)
|
||||
|
||||
#endif /* __G_MACROS_H__ */
|
||||
|
@ -50,6 +50,13 @@ test_alignof_fallback (void)
|
||||
check_alignof (struct { char a; int b; });
|
||||
}
|
||||
|
||||
static void
|
||||
test_struct_sizeof_member (void)
|
||||
{
|
||||
G_STATIC_ASSERT (G_SIZEOF_MEMBER (struct { char a; int b; }, a) == sizeof (char));
|
||||
g_assert_cmpint (G_SIZEOF_MEMBER (struct { char a; int b; }, b), ==, sizeof (int));
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
@ -58,6 +65,7 @@ main (int argc,
|
||||
|
||||
g_test_add_func ("/alignof/fallback", test_alignof_fallback);
|
||||
g_test_add_func ("/assert/static", test_assert_static);
|
||||
g_test_add_func ("/struct/sizeof_member", test_struct_sizeof_member);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user