Opened 16 years ago

Closed 13 years ago

#653 closed Patches (fixed)

[integer] add support for integers longer than long

Reported by: me22 Owned by: Daryle Walker
Milestone: Component: integer
Version: None Severity: Problem
Keywords: Cc:

Description

With the endian discussion, I looked at Boost.Integer
to try to figure out why it didn't support long long
and __int64 where possible.  Since I couldn't see a
reason why it shouldn't, I went ahead and implemented it.

The only major interface change is adding additional
ValueUpper template parameters to int_(max|min)_value_t
and uint_value_t.  They default to 0, so no valid old
code should be affected.  They allow the programmer to
use, for example, uint_value_t<0x34567890,0x12> to
request a type that can hold 0x1234567890 or
int_min_value_t<-0x34567890,-0x12> to request a type
that can hold -0x1234567890, which will properly fail
if there are no types available over 32 bits (instead
of just truncating the constant and giving the wrong
result).

I also took the opportunity to add int_exact_t
templates for cases where an exact number of bits is
needed.  int_exact_t<32>::exact, for example.  (
Ideally this would be an additional typedef inside
int_t and uint_t, but I couldn't come up with a simple
way of doing that.  If it were acceptable to have exact
as a typedef for void when not available, it'd be easy,
but that goes against existing practice. ) If this
isn't wanted, it's very easy to remove.

If this looks good I'll try to decipher the macros in
the test suite to add some new ones.  The changes don't
cause any regressions from integer_test.cpp under my
g++ 3.3.6, 3.4.6, or 4.1.1.  In keeping with the
rationale and noticing that it works just about all the
compilers, I used no partial specialisation or
recursion, so I'm hoping that it'll work fine in the
more troublesome compilers as well.  Unfortunately
portage tell me that gcc-2* is to old to work with the
rest of my system, so I haven't been able to try.

Attachments (1)

longer_int_support.diff (17.0 KB ) - added by Daryle Walker 15 years ago.
The original diff from the SourceForge version of this ticket

Download all attachments as: .zip

Change History (6)

comment:1 by Niels Dekker, 15 years ago

Please also read the discussion at the Boost User mailing list, June 2007: "[integer] Request: long long (64 bits) support for int_t and uint_t"

comment:2 by Daryle Walker, 15 years ago

Component: Noneinteger
Severity: Problem

by Daryle Walker, 15 years ago

Attachment: longer_int_support.diff added

The original diff from the SourceForge version of this ticket

comment:3 by Daryle Walker, 14 years ago

Resolution: Nonefixed
Status: assignedclosed

(In [47414]) Added extended-integer support, which fixes #653 (the main part; the secondary part is split off as #1225)

comment:4 by anonymous, 13 years ago

Resolution: fixed
Status: closedreopened

Boost.Integer has been reverted to the last known good state - these fixes are no longer in Trunk (and were never released anyway). Reopened.

comment:5 by John Maddock, 13 years ago

Resolution: fixed
Status: reopenedclosed

(In [57873]) Add support for long long throughout. Fixes #653.

Note: See TracTickets for help on using tickets.