void runAll(TestSet& tests) { vector<double> times; times.reserve(repeatCount); vector<unsigned char> v; while(tests.next(v)) { // give a particular alignment only if necessary unique_ptr<aligned_alloc> aa; memory<unsigned char> m(v); if(testAlignment) { bool alignEnd = tests.alignEnd(); int alignOfs = tests.alignment(); if(forceAlignment) { alignEnd = forceAlignmentFromEnd; alignOfs = forceAlignmentOfs; } // aligned_alloc doesn't do empty allocations, so // put those on the zero page if(!m.size()) { int ptr = alignEnd ? (64 - alignOfs) : alignOfs; m = memory<unsigned char>((unsigned char*) ptr, (unsigned char*) ptr); } else { aa = unique_ptr<aligned_alloc>(new aligned_alloc( v, alignEnd ? aligned_alloc::END_OF_PAGE : aligned_alloc::START_OF_PAGE, alignOfs)); m = memory<unsigned char>(aa.get()->begin(), aa.get()->end()); } } if(RESULT_GOOD != run(tests.description(), m) && dieOnFirstFailure) { printf("\n\nStopping early due to error\n"); break; } } printf("\n\n"); printf("Good: %0d (%0d good utf8, %0d bad utf8), confused: %0d, failed: %0d\n", totals[RESULT_GOOD], goodAccept, goodReject, totals[RESULT_CONFUSION], totals[RESULT_FAILURE]); if(printTimings) { for(TimingResult& r: timingResults) { printf("%s,\"%s\",%lld", r.validator->name().c_str(), r.itemName.c_str(), (long long) r.itemLength); for(double d : r.timings) printf(",%g", d); printf("\n"); } } }