The function ULongLong2LongLong converts an unsigned long long value
into a signed long long, effectively inverting the standard C++ cast
from signed long long to unsigned long long. Note that applying a
static_cast might not produce the desired result -- officially
the outcome is "implementation defined".
There are three different implementations. The choice between them
is determined by the value of the CPP symbol COCOA_ULONGLONG2LONGLONG;
a suitable value for this symbol is found by a script called by the
configure script. That script selects the simplest implementation
which works (on certain test cases). Note that C++ explicitly forbids
the use of reinterpret_cast on built-in integral types, but the
trick of applying to a reference seems to work (it was suggested to
me by Chris Jefferson).
An earlier version of this function was in utils.H, but it turned
out to be simpler to place it by itself in a separate header file
(because the ULongLong2LongLong.H includes no further headers, so the test
compilations made by the script cpp-flags-ulonglong2longlong.sh are simpler
and safer).
Everything is in the header file; there is no ULongLong2LongLong.C file.
The fully portable definition is long and slow -- this seems to be a problem of the C++ standard.
2022
ULong2Long)