Skip to content

nikita-sakharin/c-commons

Repository files navigation

arithmetic.h:
multiplyHigh (mulHi)
isMultipleOf, nextMultipleOf, prevMultipleOf
icopysign
isignbit (docs.gl, nvidia.com, khronos.org, numpy.org, opencl.org, vulkan.org)
ceilDivMod, euclidDivMod, floorDivMod

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.

Итого, получается нужно три макроса под три ситуации:

  1. Размотка стека;
  2. По форме POSIX;
  3. Если при обработке ошибки произошла еще одна.

Для 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)