diff options
author | Mike Buland <mike@xagasoft.com> | 2013-04-23 10:25:26 -0600 |
---|---|---|
committer | Mike Buland <mike@xagasoft.com> | 2013-04-23 10:25:26 -0600 |
commit | 9f138260dafeb5a1b541fff8dd577422439feb0b (patch) | |
tree | 148cecf83d8af00679fdde57a6b31a18f65e0296 /src | |
parent | e6401f9af190cfbaaab1dc5589546ba5cc2f5293 (diff) | |
download | clic-9f138260dafeb5a1b541fff8dd577422439feb0b.tar.gz clic-9f138260dafeb5a1b541fff8dd577422439feb0b.tar.bz2 clic-9f138260dafeb5a1b541fff8dd577422439feb0b.tar.xz clic-9f138260dafeb5a1b541fff8dd577422439feb0b.zip |
Fixed random zeros bug.0.03
They weren't that random, the resize routine in PackedIntArray was
written poorly. It was growing too much and computing the size of the
original array incorrectly, so not all the data was being copied every
time.
Diffstat (limited to 'src')
-rw-r--r-- | src/options.cpp | 2 | ||||
-rw-r--r-- | src/packedintarray.cpp | 7 | ||||
-rw-r--r-- | src/unitnumber.cpp | 14 | ||||
-rw-r--r-- | src/unitnumber.h | 1 |
4 files changed, 18 insertions, 6 deletions
diff --git a/src/options.cpp b/src/options.cpp index 89397f4..4fcf1e2 100644 --- a/src/options.cpp +++ b/src/options.cpp | |||
@@ -17,7 +17,7 @@ Options::~Options() | |||
17 | { | 17 | { |
18 | } | 18 | } |
19 | 19 | ||
20 | int Options::selfTest( Bu::StringArray aArgs ) | 20 | int Options::selfTest( Bu::StringArray ) |
21 | { | 21 | { |
22 | UnitNumber().run(); | 22 | UnitNumber().run(); |
23 | 23 | ||
diff --git a/src/packedintarray.cpp b/src/packedintarray.cpp index b91358e..824f589 100644 --- a/src/packedintarray.cpp +++ b/src/packedintarray.cpp | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | #define bitsizeof( x ) ((sizeof(x))*8) | 5 | #define bitsizeof( x ) ((sizeof(x))*8) |
6 | #define StoreBits ((bitsizeof(PackedIntArray::Store))) | 6 | #define StoreBits ((bitsizeof(PackedIntArray::Store))) |
7 | #define StoreCount( x ) (((x*iBitWidth)/StoreBits)+(((x*iBitWidth)%StoreBits)?1:0)) | 7 | #define StoreCount( x ) ((((x)*iBitWidth)/StoreBits)+((((x)*iBitWidth)%StoreBits)?1:0)) |
8 | 8 | ||
9 | PackedIntArray::PackedIntArray( PackedIntArray::Unit iBitWidth ) : | 9 | PackedIntArray::PackedIntArray( PackedIntArray::Unit iBitWidth ) : |
10 | iBitWidth( iBitWidth ), | 10 | iBitWidth( iBitWidth ), |
@@ -207,10 +207,11 @@ void PackedIntArray::checkCapacity() | |||
207 | { | 207 | { |
208 | // Bu::println("!!! Resizing !!!"); | 208 | // Bu::println("!!! Resizing !!!"); |
209 | Store *aOldData = aData; | 209 | Store *aOldData = aData; |
210 | int iSize = StoreCount(iCapacity); | ||
210 | int iNewSize = (iCapacity==0)?(bitsizeof(Store)/iBitWidth):(iCapacity=StoreCount(iCapacity*2)); | 211 | int iNewSize = (iCapacity==0)?(bitsizeof(Store)/iBitWidth):(iCapacity=StoreCount(iCapacity*2)); |
211 | while( iNewSize < iCount ) | 212 | int iCountSize = StoreCount(iCount); |
213 | while( iNewSize < iCountSize ) | ||
212 | iNewSize *= 2; | 214 | iNewSize *= 2; |
213 | int iSize = StoreCount(iCapacity); | ||
214 | // Bu::println(" %1 => %2 (%3 bit words)").arg( iSize ).arg( iNewSize ) | 215 | // Bu::println(" %1 => %2 (%3 bit words)").arg( iSize ).arg( iNewSize ) |
215 | // .arg( StoreBits ); | 216 | // .arg( StoreBits ); |
216 | aData = new Store[iNewSize]; | 217 | aData = new Store[iNewSize]; |
diff --git a/src/unitnumber.cpp b/src/unitnumber.cpp index d4bc7a8..79797c9 100644 --- a/src/unitnumber.cpp +++ b/src/unitnumber.cpp | |||
@@ -5,6 +5,8 @@ | |||
5 | UnitNumber::UnitNumber() | 5 | UnitNumber::UnitNumber() |
6 | { | 6 | { |
7 | setName("Number"); | 7 | setName("Number"); |
8 | add( static_cast<Bu::UnitSuite::Test>(&UnitNumber::parse1), | ||
9 | "parse1", Bu::UnitSuite::expectPass ); | ||
8 | add( static_cast<Bu::UnitSuite::Test>(&UnitNumber::multiply1), | 10 | add( static_cast<Bu::UnitSuite::Test>(&UnitNumber::multiply1), |
9 | "multiply1", Bu::UnitSuite::expectPass ); | 11 | "multiply1", Bu::UnitSuite::expectPass ); |
10 | } | 12 | } |
@@ -13,10 +15,18 @@ UnitNumber::~UnitNumber() | |||
13 | { | 15 | { |
14 | } | 16 | } |
15 | 17 | ||
18 | void UnitNumber::parse1() | ||
19 | { | ||
20 | unitTest( Number("121932631356500531347203169112635269").toString() == | ||
21 | "121932631356500531347203169112635269" ); | ||
22 | } | ||
23 | |||
16 | void UnitNumber::multiply1() | 24 | void UnitNumber::multiply1() |
17 | { | 25 | { |
26 | unitTest(Number("123456789") * Number("987654321") == "121932631112635269"); | ||
18 | unitTest( | 27 | unitTest( |
19 | (Number("123456789123456789") * Number("987654321987654321")).toString() | 28 | Number("123456789123456789") * Number("987654321987654321") == |
20 | == "121932631356500531347203169112635269" ); | 29 | "121932631356500531347203169112635269" |
30 | ); | ||
21 | } | 31 | } |
22 | 32 | ||
diff --git a/src/unitnumber.h b/src/unitnumber.h index 89b1c0f..76496b9 100644 --- a/src/unitnumber.h +++ b/src/unitnumber.h | |||
@@ -9,6 +9,7 @@ public: | |||
9 | UnitNumber(); | 9 | UnitNumber(); |
10 | virtual ~UnitNumber(); | 10 | virtual ~UnitNumber(); |
11 | 11 | ||
12 | void parse1(); | ||
12 | void multiply1(); | 13 | void multiply1(); |
13 | }; | 14 | }; |
14 | 15 | ||