(root)/
glibc-2.38/
include/
libc-pointer-arith.h
       1  /* Helper macros for pointer arithmetic.
       2     Copyright (C) 2012-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef _LIBC_POINTER_ARITH_H
      20  #define _LIBC_POINTER_ARITH_H 1
      21  
      22  #include <stdint.h>
      23  
      24  /* 1 if 'type' is a pointer type, 0 otherwise.  */
      25  # define __pointer_type(type) (__builtin_classify_type ((type) 0) == 5)
      26  
      27  /* intptr_t if P is true, or T if P is false.  */
      28  # define __integer_if_pointer_type_sub(T, P) \
      29    __typeof__ (*(0 ? (__typeof__ (0 ? (T *) 0 : (void *) (P))) 0 \
      30  		  : (__typeof__ (0 ? (intptr_t *) 0 : (void *) (!(P)))) 0))
      31  
      32  /* intptr_t if EXPR has a pointer type, or the type of EXPR otherwise.  */
      33  # define __integer_if_pointer_type(expr) \
      34    __integer_if_pointer_type_sub(__typeof__ ((__typeof__ (expr)) 0), \
      35  				__pointer_type (__typeof__ (expr)))
      36  
      37  /* Cast an integer or a pointer VAL to integer with proper type.  */
      38  # define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val))
      39  
      40  /* Cast an integer VAL to void * pointer.  */
      41  # define cast_to_pointer(val) ((void *) (uintptr_t) (val))
      42  
      43  /* Align a value by rounding down to closest size.
      44     e.g. Using size of 4096, we get this behavior:
      45  	{4095, 4096, 4097} = {0, 4096, 4096}.  */
      46  #define ALIGN_DOWN(base, size)	((base) & -((__typeof__ (base)) (size)))
      47  
      48  /* Align a value by rounding up to closest size.
      49     e.g. Using size of 4096, we get this behavior:
      50  	{4095, 4096, 4097} = {4096, 4096, 8192}.
      51  
      52    Note: The size argument has side effects (expanded multiple times).  */
      53  #define ALIGN_UP(base, size)	ALIGN_DOWN ((base) + (size) - 1, (size))
      54  
      55  /* Same as ALIGN_DOWN(), but automatically casts when base is a pointer.  */
      56  #define PTR_ALIGN_DOWN(base, size) \
      57    ((__typeof__ (base)) ALIGN_DOWN ((uintptr_t) (base), (size)))
      58  
      59  /* Same as ALIGN_UP(), but automatically casts when base is a pointer.  */
      60  #define PTR_ALIGN_UP(base, size) \
      61    ((__typeof__ (base)) ALIGN_UP ((uintptr_t) (base), (size)))
      62  
      63  /* Check if BASE is aligned on SIZE  */
      64  #define PTR_IS_ALIGNED(base, size) \
      65    ((((uintptr_t) (base)) & (size - 1)) == 0)
      66  
      67  /* Returns the ptrdiff_t difference between P1 and P2.  */
      68  #define PTR_DIFF(p1, p2) \
      69    ((ptrdiff_t)((uintptr_t)(p1) - (uintptr_t)(p2)))
      70  
      71  #endif