#include "wx/wxprec.h" #include "wx/longlong.h" #include #include #if defined(__MWERKS__) && macintosh #include #include #endif static const unsigned wxLongLong_t NumberOfTests = 100000l; //using namespace std; int oddbits(unsigned int number); int oddbits(unsigned int number) { int sum = 0; while(number > 0) { sum += number & 1; number >>= 1; } return sum & 1; } void random(long& hi, unsigned long& lo); void random(long& hi, unsigned long& lo) { hi = 0; lo = 0; for (int i = 0; i < 32; i++) { hi |= oddbits(rand()) << i; lo |= oddbits(rand()) << i; } } int shifttest(); int shifttest() { cout << endl << "Starting shift tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongWx l1c(hi, lo); wxLongLongWx l1b; wxLongLongNative l2a(hi, lo); wxLongLongNative l2c(hi, lo); wxLongLongNative l2b; int shift = rand() % 64; int leftshift = oddbits(rand()); if (leftshift) { l1b = l1a << shift; l2b = l2a << shift; l1c <<= shift; l2c <<= shift; } else { l1b = l1a >> shift; l2b = l2a >> shift; l1c >>= shift; l2c >>= shift; } void *oneb = l1b.asArray(); void *twob = l2b.asArray(); void *onec = l1c.asArray(); void *twoc = l2c.asArray(); if ((memcmp(oneb, twob, 8) != 0) || (memcmp(onec, twoc, 8) != 0) || (memcmp(oneb, onec, 8) != 0)) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; if (leftshift) cout << "<< "; else cout << ">> "; cout << shift << endl; cout << l1b << endl; cout << l2b << endl; cout << l1c << endl; cout << l2c << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } int add1test(); int add1test() { cout << endl << "Starting first addition tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1d(hi, lo); wxLongLongNative l2d(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); wxLongLongWx l1c; wxLongLongNative l2c; l1c = l1a + l1b; l2c = l2a + l2b; l1d += l1b; l2d += l2b; void *onec = l1c.asArray(); void *twoc = l2c.asArray(); void *oned = l1d.asArray(); void *twod = l2d.asArray(); if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0)) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; cout << l1c << endl; cout << l2c << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } /* int add2test(); int add2test() { cout << endl << "Starting second addition tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1c(hi, lo); wxLongLongNative l2c(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); l1b += l1a; l2b += l2a; void *one = l1b.asArray(); void *two = l2b.asArray(); if (memcmp(one, two, 8) != 0) { cout << endl << "After " << counter << " successful trials: " << endl; cout << l1c << endl; cout << l2c << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; return 0; } counter++; } cout << endl << counter << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } */ int sub1test(); int sub1test() { cout << endl << "Starting first subtraction tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1d(hi, lo); wxLongLongNative l2d(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); wxLongLongWx l1c; wxLongLongNative l2c; l1c = l1a - l1b; l2c = l2a - l2b; l1d -= l1b; l2d -= l2b; void *onec = l1c.asArray(); void *twoc = l2c.asArray(); void *oned = l1d.asArray(); void *twod = l2d.asArray(); if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0)) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; cout << l1c << endl; cout << l2c << endl; cout << l1d << endl; cout << l2d << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } /* int sub2test(); int sub2test() { cout << endl << "Starting second subtraction tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1c(hi, lo); wxLongLongNative l2c(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); l1b -= l1a; l2b -= l2a; void *one = l1b.asArray(); void *two = l2b.asArray(); if (memcmp(one, two, 8) != 0) { cout << endl << "After " << counter << " successful trials: " << endl; cout << l1c << endl; cout << l2c << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; return 0; } counter++; } cout << endl << counter << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } */ int incdectest(); int incdectest() { cout << endl << "Starting pre/post increment/decrement tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); int increment = oddbits(rand()); int pre = oddbits(rand()); if (increment) if (pre) { ++l1b; ++l2b; } else { l1b++; l2b++; } else if (pre) { --l1b; --l2b; } else { l1b--; l2b--; } void *one = l1b.asArray(); void *two = l2b.asArray(); if (memcmp(one, two, 8) != 0) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << (pre ? "pre" : "post") << (increment ? "increment" : "decrement") << endl; cout << l1b << endl; cout << l2b << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } int negationtest(); int negationtest() { cout << endl << "Starting negation tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1b(-l1a); wxLongLongNative l2b(-l2a); void *one = l1b.asArray(); void *two = l2b.asArray(); if (memcmp(one, two, 8) != 0) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } int multiplicationtest(); int multiplicationtest() { cout << endl << "Starting multiplication tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1d(hi, lo); wxLongLongNative l2d(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); wxLongLongWx l1c(l1a * l1b); wxLongLongNative l2c(l2a * l2b); l1d *= l1b; l2d *= l2b; void *onec = l1c.asArray(); void *twoc = l2c.asArray(); void *oned = l1c.asArray(); void *twod = l2c.asArray(); if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0)) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; cout << l1c << endl; cout << l2c << endl; cout << l1d << endl; cout << l2d << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } int bitwisetest(); int bitwisetest() { cout << endl << "Starting bitwise tests." << endl; long hi = 0; unsigned long lo = 0; unsigned wxLongLong_t counter = 0; while (counter < NumberOfTests) { if ((counter % 1000) == 999) { cerr << "+"; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif } random(hi, lo); wxLongLongWx l1a(hi, lo); wxLongLongNative l2a(hi, lo); wxLongLongWx l1d(hi, lo); wxLongLongNative l2d(hi, lo); random(hi, lo); wxLongLongWx l1b(hi, lo); wxLongLongNative l2b(hi, lo); wxLongLongWx l1c(l1a * l1b); wxLongLongNative l2c(l2a * l2b); l1d *= l1b; l2d *= l2b; void *onec = l1c.asArray(); void *twoc = l2c.asArray(); void *oned = l1c.asArray(); void *twod = l2c.asArray(); if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0)) { cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl; cout << l1a << endl; cout << l2a << endl; cout << l1b << endl; cout << l2b << endl; cout << l1c << endl; cout << l2c << endl; cout << l1d << endl; cout << l2d << endl; return 0; } counter++; } cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl; return 1; } int main() { #if defined(__MWERKS__) && macintosh SIOUXSettings.asktosaveonclose = 0; SIOUXSettings.showstatusline = 1; SIOUXSettings.autocloseonquit = 0; #endif cout << "Starting tests." << endl; #if defined(__MWERKS__) && macintosh GetNextEvent(0, NULL); #endif srand(time(NULL)); if (!multiplicationtest()) return 1; if (!shifttest()) return 1; if (!add1test()) return 1; // if (!add2test()) // return 1; if (!sub1test()) return 1; // if (!sub2test()) // return 1; if (!incdectest()) return 1; if (!negationtest()) return 1; cout << endl << "The tests are finished." << endl; return 0; }