So far, the atomic utils only support known width integer types. This
adds `unsigned int` to the supported list by mapping it to the
corresponding fixed width integer type.
This also sneaks in a few minor style fixes that clang-tidy frowned
upon.
Co-authored-by: crasbe <crasbe@gmail.com>
We occasionally have some public `foo.h` header that includes a private
`foo_arch.h` header. Users are expected to include the `foo.h` header
and not the `foo_arch.h`. However, clangd will claim that the `#include`
of `foo.h` is unused if only functions / macros/ types / ... from
`foor_arch.h` is used and nothing from `foo.h`.
This adds the `IWYU pragma: export` comment to the include of
`foo_arch.h` in `foo.h`, so that clangd treats functions / macros /
types provided by `foo_arch.h` as if they were instead provided by
`foo.h`, which fixes the false positives.
The macros CONCAT(), MIN(), and MAX() are defined over and over again in
RIOT's code base. This de-duplicates the code by moving the macros to a
common place.
Update the `atomic_fetch_<OPERATION>_u<WIDTH>()` functions to return the old
value the target contained prior to applying the operation. This makes this
API much more versatile and closer to C11 atomics.
Mark all pointers in the atomic utils API as `volatile` for the following
reasons:
1. The guarantees provided by `volatile` is a subset of the guarantees
provided by the atomic utils. This makes this fact more obvious.
2. Casting `volatile` off is undefined behavior. In order to be able to use
the atomic utils on memory mapped IO (which needs the `volatile` qualifier)
without resorting to undefined behavior, this API change is needed.