Merge branch 'sizeof-member' into 'master'

Add and use g_sizeof_member() macro

See merge request GNOME/glib!1333
This commit is contained in:
Philip Withnall 2020-01-22 11:07:03 +00:00
commit 0d9d548932
6 changed files with 28 additions and 5 deletions

View File

@ -424,6 +424,7 @@ CLAMP
G_APPROX_VALUE
<SUBSECTION>
G_SIZEOF_MEMBER
G_STRUCT_MEMBER
G_STRUCT_MEMBER_P
G_STRUCT_OFFSET

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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__ */

View File

@ -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 ();
}