arithmetic.h
:
multiplyHigh
(mulHi
)
isMultipleOf
, nextMultipleOf
, prevMultipleOf
icopysign
isignbit
(docs.gl, nvidia.com, khronos.org, numpy.org, opencl.org, vulkan.org)
ceilDivMod
, euclidDivMod
, floorDivMod
- ISO/IEC Part 1: Integer and floating point arithmetic
- ISO/IEC Part 2: Elementary numerical functions
- ISO/IEC Part 3: Complex integer and floating point arithmetic and complex elementary numerical functions
bit.h
:
{bitCount
|popCount
}
rotateLeft
, rotateRight
clear
(), reset
set
, flip
getBit
(testBit
):
testAll
(isAll
,)getAll
testAny
(isAny
,)getAny
testNone
(isNone
,)getNone
(are|have|has|is)SameSign[um]
debug.h
(check.h
):
checkArray
(checkPointer
), checkIndexSize
, checkLengthSize
error_handling.h
:
Макрос EXIT_IF
можно использовать в следующей ситуации: было выделено несколько ресурсов, далее произошла ошибка, GOTO_IF
перекинул в место, где выделенные ресурсы освобождаются. Когда вызываем функцию для освобождения ресурса, то возвращаемое значение проверяем уже с помощью EXIT_IF
, а не с помощью GOTO_IF
. В данном случае напрашивается аналогия с C++ std::terminate
, которая вызывается, если при обработке исключения, было выброшено еще одно. Возможно, в рамках данной аналогии, имеет смысл вместо функции exit
, использовать _Exit
, или даже abort
. Но вариант, просто exit
видится более органичным, более интуитивным, так как в точности копирует return
в main
(вызывает atexit
и закрывает файловые дискрипторы). С другой стороны вариант с функцией abort
ближе по семантике к std::terminate
. Вариант при котором будет отдельно макрос с abort
и отдельно с exit
кажется откровенно спорным.
Так же имеет смысл рассмотреть макрос для вывода сообщений об ошибках в формате POSIX. Например:
dir: cannot access '42': No such file or directory
,
где первый аргумент это argv[0]
, затем сообщение произвольного вида, затем perror
.
Итого, получается нужно три макроса под три ситуации:
- Размотка стека;
- По форме POSIX;
- Если при обработке ошибки произошла еще одна.
Для GOTO_IF
добавить вариант (или изменить имеющийся макрос?) который записывает текущее значение errno
в lvalue (или по указателю?) переданное в макрос, затем зануляет errno (или просто оставляет без изменений?). Переданное lvalue может содержать side-effect. Есть ОЧЕНЬ плохой вариант DO_GOTO_IF
с выполнением произвольного блока. Но данный вариант категорически ошибкоопасен и отвергается по понятным причинам.
ERR04-C. Choose an appropriate termination strategy
Baseline for Ed 2 of TR 24772
Errors
Error Messages
math.h
:
fclampf
, fclamp
, fclampl
, lerp
, saturate
toDegrees
, toRadians
DBL_1_PI
, DBL_2_PI
, DBL_2_SQRTPI
, DBL_E
, DBL_LN10
, DBL_LN2
, DBL_LOG10E
, DBL_LOG2E
, DBL_PHI
, DBL_PI
, DBL_PI_2
, DBL_PI_4
, DBL_SQRT1_2
, DBL_SQRT2
comb
(binomialCoefficient
), perm
(factorial
)
ulp
, nextDown
, nextUp
, union { uint32_t u32; flt f; }
random
numeric.h
:
gcd
, lcm
, midpoint
, fmidpoint
, isqrt
, icbrt
preprocessor.h
:
Integer Properties
check_*
(checked_*
),is_*_overflow
,is_*_undefined
wrapping_*
,overflowing_*
saturating_*
string.h
:
strFormat
, strNFormat
, strReverse
, strNReverse
utility.h
:
elemCompareEqual
, elemCompareGreater
, elemCompareGreaterEqual
, elemCompareLess
, elemCompareLessEqual
, elemCompareNotEqual
memCompareEqual
, memCompareGreater
, memCompareGreaterEqual
, memCompareLess
, memCompareLessEqual
, memCompareNotEqual
memReverse
memRotate
(memExchange
, memShift
)
ptrRemoveConst
(ptrConstCast
), ptrRemoveConstVolatile
(ptrConstVolatileCast
), ptrRemoveVolatile
(ptrVolatileCast
)