📄 ut0byte.h
字号:
/**********************************************************************Utilities for byte operations(c) 1994, 1995 Innobase OyCreated 1/20/1994 Heikki Tuuri***********************************************************************/#ifndef ut0byte_h#define ut0byte_h#include "univ.i"/* Type definition for a 64-bit unsigned integer, which works alsoin 32-bit machines. NOTE! Access the fields only with the accessorfunctions. This definition appears here only for the compiler toknow the size of a dulint. */typedef struct dulint_struct dulint;struct dulint_struct{ ulint high; /* most significant 32 bits */ ulint low; /* least significant 32 bits */};/* Zero value for a dulint */extern dulint ut_dulint_zero;/* Maximum value for a dulint */extern dulint ut_dulint_max;/***********************************************************Creates a 64-bit dulint out of two ulints. */UNIV_INLINEdulintut_dulint_create(/*=============*/ /* out: created dulint */ ulint high, /* in: high-order 32 bits */ ulint low); /* in: low-order 32 bits *//***********************************************************Gets the high-order 32 bits of a dulint. */UNIV_INLINEulintut_dulint_get_high(/*===============*/ /* out: 32 bits in ulint */ dulint d); /* in: dulint *//***********************************************************Gets the low-order 32 bits of a dulint. */UNIV_INLINEulintut_dulint_get_low(/*==============*/ /* out: 32 bits in ulint */ dulint d); /* in: dulint *//***********************************************************Converts a dulint (a struct of 2 ulints) to ib_longlong, which is a 64-bitinteger type. */UNIV_INLINEib_longlongut_conv_dulint_to_longlong(/*=======================*/ /* out: value in ib_longlong type */ dulint d); /* in: dulint *//***********************************************************Tests if a dulint is zero. */UNIV_INLINEiboolut_dulint_is_zero(/*==============*/ /* out: TRUE if zero */ dulint a); /* in: dulint *//***********************************************************Compares two dulints. */UNIV_INLINEintut_dulint_cmp(/*==========*/ /* out: -1 if a < b, 0 if a == b, 1 if a > b */ dulint a, /* in: dulint */ dulint b); /* in: dulint *//***********************************************************Calculates the max of two dulints. */UNIV_INLINEdulintut_dulint_get_max(/*==============*/ /* out: max(a, b) */ dulint a, /* in: dulint */ dulint b); /* in: dulint *//***********************************************************Calculates the min of two dulints. */UNIV_INLINEdulintut_dulint_get_min(/*==============*/ /* out: min(a, b) */ dulint a, /* in: dulint */ dulint b); /* in: dulint *//***********************************************************Adds a ulint to a dulint. */UNIV_INLINEdulintut_dulint_add(/*==========*/ /* out: sum a + b */ dulint a, /* in: dulint */ ulint b); /* in: ulint *//***********************************************************Subtracts a ulint from a dulint. */UNIV_INLINEdulintut_dulint_subtract(/*===============*/ /* out: a - b */ dulint a, /* in: dulint */ ulint b); /* in: ulint, b <= a *//***********************************************************Subtracts a dulint from another. NOTE that the difference must be positiveand smaller that 4G. */UNIV_INLINEulintut_dulint_minus(/*============*/ /* out: a - b */ dulint a, /* in: dulint; NOTE a must be >= b and at most 2 to power 32 - 1 greater */ dulint b); /* in: dulint *//************************************************************Rounds a dulint downward to a multiple of a power of 2. */UNIV_INLINEdulintut_dulint_align_down(/*=================*/ /* out: rounded value */ dulint n, /* in: number to be rounded */ ulint align_no); /* in: align by this number which must be a power of 2 *//************************************************************Rounds a dulint upward to a multiple of a power of 2. */UNIV_INLINEdulintut_dulint_align_up(/*===============*/ /* out: rounded value */ dulint n, /* in: number to be rounded */ ulint align_no); /* in: align by this number which must be a power of 2 *//***********************************************************Increments a dulint variable by 1. */#define UT_DULINT_INC(D)\{\ if ((D).low == 0xFFFFFFFFUL) {\ (D).high = (D).high + 1;\ (D).low = 0;\ } else {\ (D).low = (D).low + 1;\ }\}/***********************************************************Tests if two dulints are equal. */#define UT_DULINT_EQ(D1, D2) (((D1).low == (D2).low)\ && ((D1).high == (D2).high))/****************************************************************Sort function for dulint arrays. */voidut_dulint_sort(dulint* arr, dulint* aux_arr, ulint low, ulint high);/*===============================================================*//************************************************************The following function calculates the value of an integer n roundedto the least product of align_no which is >= n. align_no has to be apower of 2. */UNIV_INLINEulintut_calc_align(/*==========*/ /* out: rounded value */ ulint n, /* in: number to be rounded */ ulint align_no); /* in: align by this number *//************************************************************The following function calculates the value of an integer n roundedto the biggest product of align_no which is <= n. align_no has to be apower of 2. */UNIV_INLINEulintut_calc_align_down(/*===============*/ /* out: rounded value */ ulint n, /* in: number to be rounded */ ulint align_no); /* in: align by this number *//*************************************************************The following function rounds up a pointer to the nearest aligned address. */UNIV_INLINEvoid*ut_align(/*=====*/ /* out: aligned pointer */ void* ptr, /* in: pointer */ ulint align_no); /* in: align by this number *//*************************************************************The following function rounds down a pointer to the nearestaligned address. */UNIV_INLINEvoid*ut_align_down(/*==========*/ /* out: aligned pointer */ void* ptr, /* in: pointer */ ulint align_no) /* in: align by this number */ __attribute__((const));/*************************************************************The following function computes the offset of a pointer from the nearestaligned address. */UNIV_INLINEulintut_align_offset(/*==========*/ /* out: distance from aligned pointer */ const void* ptr, /* in: pointer */ ulint align_no) /* in: align by this number */ __attribute__((const));/*********************************************************************Gets the nth bit of a ulint. */UNIV_INLINEiboolut_bit_get_nth(/*===========*/ /* out: TRUE if nth bit is 1; 0th bit is defined to be the least significant */ ulint a, /* in: ulint */ ulint n); /* in: nth bit requested *//*********************************************************************Sets the nth bit of a ulint. */UNIV_INLINEulintut_bit_set_nth(/*===========*/ /* out: the ulint with the bit set as requested */ ulint a, /* in: ulint */ ulint n, /* in: nth bit requested */ ibool val); /* in: value for the bit to set */#ifndef UNIV_NONINL#include "ut0byte.ic"#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -