Change log level at g_log_remove_handler
[platform/upstream/glib.git] / glib / gtypes.h
index ac856a7..9d912d5 100644 (file)
@@ -1,10 +1,12 @@
 /* GLIB - Library of useful routines for C programming
  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
  *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GLib Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */
 
 #ifndef __G_TYPES_H__
 #define __G_TYPES_H__
 
+#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
+#error "Only <glib.h> can be included directly."
+#endif
+
 #include <glibconfig.h>
+#include <glib/gmacros.h>
+#include <glib/gversionmacros.h>
+
+/* Must be included after the 3 headers above */
+#include <glib/glib-visibility.h>
+
+#include <time.h>
 
 G_BEGIN_DECLS
 
@@ -43,7 +54,6 @@ typedef short  gshort;
 typedef long   glong;
 typedef int    gint;
 typedef gint   gboolean;
-typedef gchar* gstring;
 
 typedef unsigned char   guchar;
 typedef unsigned short  gushort;
@@ -53,22 +63,80 @@ typedef unsigned int    guint;
 typedef float   gfloat;
 typedef double  gdouble;
 
-/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms.
- * Since gldouble isn't used anywhere, just disable it for now */
+/* Define min and max constants for the fixed size numerical types */
+/**
+ * G_MININT8: (value -128)
+ *
+ * The minimum value which can be held in a #gint8.
+ *
+ * Since: 2.4
+ */
+#define G_MININT8      ((gint8) (-G_MAXINT8 - 1))
+#define G_MAXINT8      ((gint8)  0x7f)
+#define G_MAXUINT8     ((guint8) 0xff)
+
+/**
+ * G_MININT16: (value -32768)
+ *
+ * The minimum value which can be held in a #gint16.
+ *
+ * Since: 2.4
+ */
+#define G_MININT16     ((gint16) (-G_MAXINT16 - 1))
+#define G_MAXINT16     ((gint16)  0x7fff)
+#define G_MAXUINT16    ((guint16) 0xffff)
 
-#if 0
-#ifdef HAVE_LONG_DOUBLE
-typedef long double gldouble;
-#else /* HAVE_LONG_DOUBLE */
-typedef double gldouble;
-#endif /* HAVE_LONG_DOUBLE */
-#endif /* 0 */
+/**
+ * G_MININT32: (value -2147483648)
+ *
+ * The minimum value which can be held in a #gint32.
+ *
+ * Since: 2.4
+ */
+#define G_MININT32     ((gint32) (-G_MAXINT32 - 1))
+#define G_MAXINT32     ((gint32)  0x7fffffff)
+#define G_MAXUINT32    ((guint32) 0xffffffff)
+
+/**
+ * G_MININT64: (value -9223372036854775808)
+ *
+ * The minimum value which can be held in a #gint64.
+ */
+#define G_MININT64     ((gint64) (-G_MAXINT64 - G_GINT64_CONSTANT(1)))
+#define G_MAXINT64     G_GINT64_CONSTANT(0x7fffffffffffffff)
+#define G_MAXUINT64    G_GUINT64_CONSTANT(0xffffffffffffffff)
 
 typedef void* gpointer;
 typedef const void *gconstpointer;
 
 typedef gint            (*GCompareFunc)         (gconstpointer  a,
                                                  gconstpointer  b);
+typedef gint            (*GCompareDataFunc)     (gconstpointer  a,
+                                                 gconstpointer  b,
+                                                gpointer       user_data);
+typedef gboolean        (*GEqualFunc)           (gconstpointer  a,
+                                                 gconstpointer  b);
+
+/**
+ * GEqualFuncFull:
+ * @a: a value
+ * @b: a value to compare with
+ * @user_data: user data provided by the caller
+ *
+ * Specifies the type of a function used to test two values for
+ * equality. The function should return %TRUE if both values are equal
+ * and %FALSE otherwise.
+ *
+ * This is a version of #GEqualFunc which provides a @user_data closure from
+ * the caller.
+ *
+ * Returns: %TRUE if @a = @b; %FALSE otherwise
+ * Since: 2.74
+ */
+typedef gboolean        (*GEqualFuncFull)       (gconstpointer  a,
+                                                 gconstpointer  b,
+                                                 gpointer       user_data);
+
 typedef void            (*GDestroyNotify)       (gpointer       data);
 typedef void            (*GFunc)                (gpointer       data,
                                                  gpointer       user_data);
@@ -77,16 +145,63 @@ typedef void            (*GHFunc)               (gpointer       key,
                                                  gpointer       value,
                                                  gpointer       user_data);
 
+/**
+ * GCopyFunc:
+ * @src: (not nullable): A pointer to the data which should be copied
+ * @data: Additional data
+ *
+ * A function of this signature is used to copy the node data
+ * when doing a deep-copy of a tree.
+ *
+ * Returns: (not nullable): A pointer to the copy
+ *
+ * Since: 2.4
+ */
+typedef gpointer       (*GCopyFunc)            (gconstpointer  src,
+                                                 gpointer       data);
+/**
+ * GFreeFunc:
+ * @data: a data pointer
+ *
+ * Declares a type of function which takes an arbitrary
+ * data pointer argument and has no return value. It is
+ * not currently used in GLib or GTK.
+ */
+typedef void            (*GFreeFunc)            (gpointer       data);
+
+/**
+ * GTranslateFunc:
+ * @str: the untranslated string
+ * @data: user data specified when installing the function, e.g.
+ *  in g_option_group_set_translate_func()
+ * 
+ * The type of functions which are used to translate user-visible
+ * strings, for <option>--help</option> output.
+ * 
+ * Returns: a translation of the string for the current locale.
+ *  The returned string is owned by GLib and must not be freed.
+ */
+typedef const gchar *   (*GTranslateFunc)       (const gchar   *str,
+                                                gpointer       data);
+
+
 /* Define some mathematical constants that aren't available
  * symbolically in some strict ISO C implementations.
+ *
+ * Note that the large number of digits used in these definitions
+ * doesn't imply that GLib or current computers in general would be
+ * able to handle floating point numbers with an accuracy like this.
+ * It's mostly an exercise in futility and future proofing. For
+ * extended precision floating point support, look somewhere else
+ * than GLib.
  */
-#define G_E     2.7182818284590452354E0
-#define G_LN2   6.9314718055994530942E-1
-#define G_LN10  2.3025850929940456840E0
-#define G_PI    3.14159265358979323846E0
-#define G_PI_2  1.57079632679489661923E0
-#define G_PI_4  0.78539816339744830962E0
-#define G_SQRT2 1.4142135623730950488E0
+#define G_E     2.7182818284590452353602874713526624977572470937000
+#define G_LN2   0.69314718055994530941723212145817656807550013436026
+#define G_LN10  2.3025850929940456840179914546843642076011014886288
+#define G_PI    3.1415926535897932384626433832795028841971693993751
+#define G_PI_2  1.5707963267948966192313216916397514420985846996876
+#define G_PI_4  0.78539816339744830961566084581987572104929234984378
+#define G_SQRT2 1.4142135623730950488016887242096980785696718753769
 
 /* Portable endian checks and conversions
  *
@@ -101,99 +216,186 @@ typedef void            (*GHFunc)               (gpointer       key,
 /* Basic bit swapping functions
  */
 #define GUINT16_SWAP_LE_BE_CONSTANT(val)       ((guint16) ( \
-    (((guint16) (val) & (guint16) 0x00ffU) << 8) | \
-    (((guint16) (val) & (guint16) 0xff00U) >> 8)))
+    (guint16) ((guint16) (val) >> 8) | \
+    (guint16) ((guint16) (val) << 8)))
+
 #define GUINT32_SWAP_LE_BE_CONSTANT(val)       ((guint32) ( \
     (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \
     (((guint32) (val) & (guint32) 0x0000ff00U) <<  8) | \
     (((guint32) (val) & (guint32) 0x00ff0000U) >>  8) | \
     (((guint32) (val) & (guint32) 0xff000000U) >> 24)))
 
-/* Intel specific stuff for speed
- */
-#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
-#  define GUINT16_SWAP_LE_BE_X86(val) \
-     (__extension__                                    \
-      ({ register guint16 __v;                         \
-        if (__builtin_constant_p (val))                \
-          __v = GUINT16_SWAP_LE_BE_CONSTANT (val);     \
-        else                                           \
-          __asm__ __const__ ("rorw $8, %w0"            \
-                             : "=r" (__v)              \
-                             : "0" ((guint16) (val))); \
-       __v; }))
-#  define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_X86 (val))
-#  if !defined(__i486__) && !defined(__i586__) \
-      && !defined(__pentium__) && !defined(__i686__) && !defined(__pentiumpro__)
-#     define GUINT32_SWAP_LE_BE_X86(val) \
-        (__extension__                                         \
-         ({ register guint32 __v;                              \
-           if (__builtin_constant_p (val))                     \
-             __v = GUINT32_SWAP_LE_BE_CONSTANT (val);          \
-         else                                                  \
-           __asm__ __const__ ("rorw $8, %w0\n\t"               \
-                              "rorl $16, %0\n\t"               \
-                              "rorw $8, %w0"                   \
-                              : "=r" (__v)                     \
-                              : "0" ((guint32) (val)));        \
-       __v; }))
-#  else /* 486 and higher has bswap */
-#     define GUINT32_SWAP_LE_BE_X86(val) \
-        (__extension__                                         \
-         ({ register guint32 __v;                              \
-           if (__builtin_constant_p (val))                     \
-             __v = GUINT32_SWAP_LE_BE_CONSTANT (val);          \
-         else                                                  \
-           __asm__ __const__ ("bswap %0"                       \
-                              : "=r" (__v)                     \
-                              : "0" ((guint32) (val)));        \
-       __v; }))
-#  endif /* processor specific 32-bit stuff */
-#  define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86 (val))
-#else /* !__i386__ */
-#  define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
-#  define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
-#endif /* __i386__ */
-
-#ifdef G_HAVE_GINT64
-#  define GUINT64_SWAP_LE_BE_CONSTANT(val)     ((guint64) ( \
+#define GUINT64_SWAP_LE_BE_CONSTANT(val)       ((guint64) ( \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x00000000000000ffU)) << 56) |      \
+       (guint64) G_GINT64_CONSTANT (0x00000000000000ffU)) << 56) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x000000000000ff00U)) << 40) |      \
+       (guint64) G_GINT64_CONSTANT (0x000000000000ff00U)) << 40) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x0000000000ff0000U)) << 24) |      \
+       (guint64) G_GINT64_CONSTANT (0x0000000000ff0000U)) << 24) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x00000000ff000000U)) <<  8) |      \
+       (guint64) G_GINT64_CONSTANT (0x00000000ff000000U)) <<  8) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x000000ff00000000U)) >>  8) |      \
+       (guint64) G_GINT64_CONSTANT (0x000000ff00000000U)) >>  8) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x0000ff0000000000U)) >> 24) |      \
+       (guint64) G_GINT64_CONSTANT (0x0000ff0000000000U)) >> 24) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0x00ff000000000000U)) >> 40) |      \
+       (guint64) G_GINT64_CONSTANT (0x00ff000000000000U)) >> 40) |     \
       (((guint64) (val) &                                              \
-       (guint64) G_GINT64_CONSTANT(0xff00000000000000U)) >> 56)))
-#  if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
-#    define GUINT64_SWAP_LE_BE_X86(val) \
-       (__extension__                                          \
-        ({ union { guint64 __ll;                               \
-                   guint32 __l[2]; } __r;                      \
-           if (__builtin_constant_p (val))                     \
-             __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (val);     \
+       (guint64) G_GINT64_CONSTANT (0xff00000000000000U)) >> 56)))
+
+/* Arch specific stuff for speed
+ */
+#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
+
+#  if __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
+#    define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((guint32) (val)))
+#    define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((guint64) (val)))
+#  endif
+
+#  if defined (__i386__)
+#    define GUINT16_SWAP_LE_BE_IA32(val) \
+       (G_GNUC_EXTENSION                                       \
+       ({ guint16 __v, __x = ((guint16) (val));                \
+          if (__builtin_constant_p (__x))                      \
+            __v = GUINT16_SWAP_LE_BE_CONSTANT (__x);           \
+          else                                                 \
+            __asm__ ("rorw $8, %w0"                            \
+                     : "=r" (__v)                              \
+                     : "0" (__x)                               \
+                     : "cc");                                  \
+           __v; }))
+#    if !defined (__i486__) && !defined (__i586__) \
+       && !defined (__pentium__) && !defined (__i686__) \
+       && !defined (__pentiumpro__) && !defined (__pentium4__)
+#       define GUINT32_SWAP_LE_BE_IA32(val) \
+         (G_GNUC_EXTENSION                                     \
+          ({ guint32 __v, __x = ((guint32) (val));             \
+             if (__builtin_constant_p (__x))                   \
+               __v = GUINT32_SWAP_LE_BE_CONSTANT (__x);        \
+             else                                              \
+               __asm__ ("rorw $8, %w0\n\t"                     \
+                        "rorl $16, %0\n\t"                     \
+                        "rorw $8, %w0"                         \
+                        : "=r" (__v)                           \
+                        : "0" (__x)                            \
+                        : "cc");                               \
+             __v; }))
+#    else /* 486 and higher has bswap */
+#       define GUINT32_SWAP_LE_BE_IA32(val) \
+         (G_GNUC_EXTENSION                                     \
+          ({ guint32 __v, __x = ((guint32) (val));             \
+             if (__builtin_constant_p (__x))                   \
+               __v = GUINT32_SWAP_LE_BE_CONSTANT (__x);        \
+             else                                              \
+               __asm__ ("bswap %0"                             \
+                        : "=r" (__v)                           \
+                        : "0" (__x));                          \
+             __v; }))
+#    endif /* processor specific 32-bit stuff */
+#    define GUINT64_SWAP_LE_BE_IA32(val) \
+       (G_GNUC_EXTENSION                                               \
+       ({ union { guint64 __ll;                                        \
+                  guint32 __l[2]; } __w, __r;                          \
+          __w.__ll = ((guint64) (val));                                \
+          if (__builtin_constant_p (__w.__ll))                         \
+            __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (__w.__ll);         \
+          else                                                         \
+            {                                                          \
+              __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]);            \
+              __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]);            \
+            }                                                          \
+          __r.__ll; }))
+     /* Possibly just use the constant version and let gcc figure it out? */
+#    define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA32 (val))
+#    ifndef GUINT32_SWAP_LE_BE
+#      define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val))
+#    endif
+#    ifndef GUINT64_SWAP_LE_BE
+#      define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val))
+#    endif
+#  elif defined (__ia64__)
+#    define GUINT16_SWAP_LE_BE_IA64(val) \
+       (G_GNUC_EXTENSION                                       \
+       ({ guint16 __v, __x = ((guint16) (val));                \
+          if (__builtin_constant_p (__x))                      \
+            __v = GUINT16_SWAP_LE_BE_CONSTANT (__x);           \
+          else                                                 \
+            __asm__ __volatile__ ("shl %0 = %1, 48 ;;"         \
+                                  "mux1 %0 = %0, @rev ;;"      \
+                                   : "=r" (__v)                \
+                                   : "r" (__x));               \
+           __v; }))
+#    define GUINT32_SWAP_LE_BE_IA64(val) \
+       (G_GNUC_EXTENSION                                       \
+        ({ guint32 __v, __x = ((guint32) (val));               \
+           if (__builtin_constant_p (__x))                     \
+             __v = GUINT32_SWAP_LE_BE_CONSTANT (__x);          \
+           else                                                \
+            __asm__ __volatile__ ("shl %0 = %1, 32 ;;"         \
+                                  "mux1 %0 = %0, @rev ;;"      \
+                                   : "=r" (__v)                \
+                                   : "r" (__x));               \
+           __v; }))
+#    define GUINT64_SWAP_LE_BE_IA64(val) \
+       (G_GNUC_EXTENSION                                       \
+       ({ guint64 __v, __x = ((guint64) (val));                \
+          if (__builtin_constant_p (__x))                      \
+            __v = GUINT64_SWAP_LE_BE_CONSTANT (__x);           \
+          else                                                 \
+            __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;"      \
+                                  : "=r" (__v)                 \
+                                  : "r" (__x));                \
+          __v; }))
+#    define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA64 (val))
+#    ifndef GUINT32_SWAP_LE_BE
+#      define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val))
+#    endif
+#    ifndef GUINT64_SWAP_LE_BE
+#      define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val))
+#    endif
+#  elif defined (__x86_64__)
+#    define GUINT32_SWAP_LE_BE_X86_64(val) \
+       (G_GNUC_EXTENSION                                       \
+        ({ guint32 __v, __x = ((guint32) (val));               \
+           if (__builtin_constant_p (__x))                     \
+             __v = GUINT32_SWAP_LE_BE_CONSTANT (__x);          \
            else                                                \
-             {                                                 \
-               union { guint64 __ll;                           \
-                       guint32 __l[2]; } __w;                  \
-               __w.__ll = ((guint64) val);                     \
-               __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]);   \
-               __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]);   \
-             }                                                 \
-         __r.__ll; }))
-#    define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86 (val))
-#  else /* !__i386__ */
-#    define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT(val))
+            __asm__ ("bswapl %0"                               \
+                     : "=r" (__v)                              \
+                     : "0" (__x));                             \
+           __v; }))
+#    define GUINT64_SWAP_LE_BE_X86_64(val) \
+       (G_GNUC_EXTENSION                                       \
+       ({ guint64 __v, __x = ((guint64) (val));                \
+          if (__builtin_constant_p (__x))                      \
+            __v = GUINT64_SWAP_LE_BE_CONSTANT (__x);           \
+          else                                                 \
+            __asm__ ("bswapq %0"                               \
+                     : "=r" (__v)                              \
+                     : "0" (__x));                             \
+          __v; }))
+     /* gcc seems to figure out optimal code for this on its own */
+#    define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+#    ifndef GUINT32_SWAP_LE_BE
+#      define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val))
+#    endif
+#    ifndef GUINT64_SWAP_LE_BE
+#      define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val))
+#    endif
+#  else /* generic gcc */
+#    define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+#    ifndef GUINT32_SWAP_LE_BE
+#      define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
+#    endif
+#    ifndef GUINT64_SWAP_LE_BE
+#      define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
+#    endif
 #  endif
-#endif
+#else /* generic */
+#  define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+#  define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
+#  define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
+#endif /* generic */
 
 #define GUINT16_SWAP_LE_PDP(val)       ((guint16) (val))
 #define GUINT16_SWAP_BE_PDP(val)       (GUINT16_SWAP_LE_BE (val))
@@ -216,12 +418,10 @@ typedef void            (*GHFunc)               (gpointer       key,
 #define GINT32_FROM_BE(val)    (GINT32_TO_BE (val))
 #define GUINT32_FROM_BE(val)   (GUINT32_TO_BE (val))
 
-#ifdef G_HAVE_GINT64
 #define GINT64_FROM_LE(val)    (GINT64_TO_LE (val))
 #define GUINT64_FROM_LE(val)   (GUINT64_TO_LE (val))
 #define GINT64_FROM_BE(val)    (GINT64_TO_BE (val))
 #define GUINT64_FROM_BE(val)   (GUINT64_TO_BE (val))
-#endif
 
 #define GLONG_FROM_LE(val)     (GLONG_TO_LE (val))
 #define GULONG_FROM_LE(val)    (GULONG_TO_LE (val))
@@ -233,6 +433,10 @@ typedef void            (*GHFunc)               (gpointer       key,
 #define GINT_FROM_BE(val)      (GINT_TO_BE (val))
 #define GUINT_FROM_BE(val)     (GUINT_TO_BE (val))
 
+#define GSIZE_FROM_LE(val)     (GSIZE_TO_LE (val))
+#define GSSIZE_FROM_LE(val)    (GSSIZE_TO_LE (val))
+#define GSIZE_FROM_BE(val)     (GSIZE_TO_BE (val))
+#define GSSIZE_FROM_BE(val)    (GSSIZE_TO_BE (val))
 
 /* Portable versions of host-network order stuff
  */
@@ -241,6 +445,69 @@ typedef void            (*GHFunc)               (gpointer       key,
 #define g_htonl(val) (GUINT32_TO_BE (val))
 #define g_htons(val) (GUINT16_TO_BE (val))
 
+/* Overflow-checked unsigned integer arithmetic
+ */
+#ifndef _GLIB_TEST_OVERFLOW_FALLBACK
+/* https://bugzilla.gnome.org/show_bug.cgi?id=769104 */
+#if __GNUC__ >= 5 && !defined(__INTEL_COMPILER)
+#define _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
+#elif g_macro__has_builtin(__builtin_add_overflow)
+#define _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
+#endif
+#endif
+
+#ifdef _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS
+
+#define g_uint_checked_add(dest, a, b) \
+    (!__builtin_add_overflow(a, b, dest))
+#define g_uint_checked_mul(dest, a, b) \
+    (!__builtin_mul_overflow(a, b, dest))
+
+#define g_uint64_checked_add(dest, a, b) \
+    (!__builtin_add_overflow(a, b, dest))
+#define g_uint64_checked_mul(dest, a, b) \
+    (!__builtin_mul_overflow(a, b, dest))
+
+#define g_size_checked_add(dest, a, b) \
+    (!__builtin_add_overflow(a, b, dest))
+#define g_size_checked_mul(dest, a, b) \
+    (!__builtin_mul_overflow(a, b, dest))
+
+#else  /* !_GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS */
+
+/* The names of the following inlines are private.  Use the macro
+ * definitions above.
+ */
+static inline gboolean _GLIB_CHECKED_ADD_UINT (guint *dest, guint a, guint b) {
+  *dest = a + b; return *dest >= a; }
+static inline gboolean _GLIB_CHECKED_MUL_UINT (guint *dest, guint a, guint b) {
+  *dest = a * b; return !a || *dest / a == b; }
+static inline gboolean _GLIB_CHECKED_ADD_UINT64 (guint64 *dest, guint64 a, guint64 b) {
+  *dest = a + b; return *dest >= a; }
+static inline gboolean _GLIB_CHECKED_MUL_UINT64 (guint64 *dest, guint64 a, guint64 b) {
+  *dest = a * b; return !a || *dest / a == b; }
+static inline gboolean _GLIB_CHECKED_ADD_SIZE (gsize *dest, gsize a, gsize b) {
+  *dest = a + b; return *dest >= a; }
+static inline gboolean _GLIB_CHECKED_MUL_SIZE (gsize *dest, gsize a, gsize b) {
+  *dest = a * b; return !a || *dest / a == b; }
+
+#define g_uint_checked_add(dest, a, b) \
+    _GLIB_CHECKED_ADD_UINT(dest, a, b)
+#define g_uint_checked_mul(dest, a, b) \
+    _GLIB_CHECKED_MUL_UINT(dest, a, b)
+
+#define g_uint64_checked_add(dest, a, b) \
+    _GLIB_CHECKED_ADD_UINT64(dest, a, b)
+#define g_uint64_checked_mul(dest, a, b) \
+    _GLIB_CHECKED_MUL_UINT64(dest, a, b)
+
+#define g_size_checked_add(dest, a, b) \
+    _GLIB_CHECKED_ADD_SIZE(dest, a, b)
+#define g_size_checked_mul(dest, a, b) \
+    _GLIB_CHECKED_MUL_SIZE(dest, a, b)
+
+#endif  /* !_GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS */
+
 /* IEEE Standard 754 Single Precision Storage Format (gfloat):
  *
  *        31 30           23 22            0
@@ -262,7 +529,7 @@ typedef union  _GDoubleIEEE754      GDoubleIEEE754;
 typedef union  _GFloatIEEE754  GFloatIEEE754;
 #define G_IEEE754_FLOAT_BIAS   (127)
 #define G_IEEE754_DOUBLE_BIAS  (1023)
-/* multiply with base2 exponent to get base10 exponent (nomal numbers) */
+/* multiply with base2 exponent to get base10 exponent (normal numbers) */
 #define G_LOG_2_BASE_10                (0.30102999566398119521)
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
 union _GFloatIEEE754
@@ -308,7 +575,17 @@ union _GDoubleIEEE754
 #error unknown ENDIAN type
 #endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
 
+typedef struct _GTimeVal GTimeVal GLIB_DEPRECATED_TYPE_IN_2_62_FOR(GDateTime);
+
+struct _GTimeVal
+{
+  glong tv_sec;
+  glong tv_usec;
+} GLIB_DEPRECATED_TYPE_IN_2_62_FOR(GDateTime);
+
+typedef gint grefcount;
+typedef gint gatomicrefcount;  /* should be accessed only using atomics */
+
 G_END_DECLS
 
 #endif /* __G_TYPES_H__ */
-