No UNSIGNED_BYTE in Any
Lionel Elie Mamane
lionel at mamane.lu
Fri Jan 25 03:52:21 PST 2013
On Thu, Jan 03, 2013 at 02:54:32PM +0100, Lubos Lunak wrote:
> On Thursday 27 of December 2012, Lionel Elie Mamane wrote:
>> The following code does not do what one would think:
>> sal_uInt8 nValue = 255;
>> Any aValue;
>> aValue <<= nValue;
>> aValue now contains a *BOOLEAN*. That's rather... surprising, and
>> could bite any of us one day.
> Why could? There's exactly the same problem with sal_Unicode and
> I'm pretty sure there already have been trouble with this.
For sal_Bool, it is worse, because it is normalised to sal_True or
sal_False. Which makes sense when one thinks of it as a boolean, but
when treating it as a sal_uInt8, it breaks the principle of least
surprise. If you do:
sal_uInt8 nValue = 255;
Any aValue;
aValue <<= nValue;
sal_uInt8 nValue2;
aValue >>= nValue2;
then nValue2 contains 1, not 255. That's just devilish in my eyes.
By contrast, for FOO being *any* value (assuming sal_Unicode is sal_uInt16?):
sal_uInt16 nValue = FOO;
Any aValue;
aValue <<= nValue;
sal_uInt16 nValue2;
aValue >>= nValue2;
assert(nValue == nValue2); // assertion will *always* succeed
>> Since we are in our "unstable API/ABI" period, *if* we can have a
>> clean solution, let's have it for LibreOffice 4.1. Since the in-memory
>> layout of sal_Bool does not change (right?), this might even be fully
>> ABI-compatible? (but not API-compatible for C, but API-compatible for
>> C++)
> Turning sal_Bool into a non-integer type breaks enough code to not
> be worth it (I know, I tried it once). If we decide to break ABI, we
> can just go with bool. If not, we probably can't do anything.
I was under the impression that my struct hack would not break ABI,
unless there are subtle issues I don't see (e.g. different alignment
rules)?
>> Why did I get into this? Well, see https://gerrit.libreoffice.org/#/c/1164/
> Unless you have _very_ good reasons, just don't bother with 8-bit
> integers.
Well, I'm faced with interfacing with systems that (potentially)
provide data with some 8-bit integers in them, and "as faithfully as
possible" present them to our users... Looks like I'll have to make an
exception for unsigned 8 bit integer in some way. This is very
annoying to me, because my longer-term intention was to offer an API like:
Any XRow::getAny(integer colNum)
Any XUpdatableRow::setAny(integer colNum)
To make code like this work:
RecordSet src;
RecordSet dst;
for (i=1; i<=colCount, ++i)
dst.setAny(i, src.getAny(i))
So, now, if column "2" contains an unsigned 8 bit integer... I can't
put a sal_Bool in the Any returned by src.getAny(2); so I introduce my
own UNO "struct" just to "wrap" 8-bit unsigned integer? I put a 16 bit
integer in it? Introduce my own database-specific Any-like type
(basically exporting connectivity::ORowSetValue)? I'll have to think
about it...
--
Lionel
More information about the LibreOffice
mailing list