static void TestLog2() { if( Verbose ) printf("testing __TBB_Log2\n"); for( uintptr_t i=1; i; i<<=1 ) { for( uintptr_t j=1; j<1<<16; ++j ) { if( uintptr_t k = i*j ) { uintptr_t actual = __TBB_Log2(k); const uintptr_t ONE = 1; // warning suppression again ASSERT( k >= ONE<<actual, NULL ); ASSERT( k>>1 < ONE<<actual, NULL ); } } }
//! Test reserve, compact, capacity void TestCapacity() { typedef static_counting_allocator<debug_allocator<Foo,tbb::cache_aligned_allocator>, std::size_t> allocator_t; typedef tbb::concurrent_vector<Foo, allocator_t> vector_t; allocator_t::init_counters(); for( size_t old_size=0; old_size<=11000; old_size=(old_size<5 ? old_size+1 : 3*old_size) ) { for( size_t new_size=0; new_size<=11000; new_size=(new_size<5 ? new_size+1 : 3*new_size) ) { long count = FooCount; { vector_t v; v.reserve(old_size); ASSERT( v.capacity()>=old_size, NULL ); v.reserve( new_size ); ASSERT( v.capacity()>=old_size, NULL ); ASSERT( v.capacity()>=new_size, NULL ); ASSERT( v.empty(), NULL ); size_t fill_size = 2*new_size; for( size_t i=0; i<fill_size; ++i ) { ASSERT( size_t(FooCount)==count+i, NULL ); #if TBB_DEPRECATED size_t j = v.grow_by(1); #else size_t j = v.grow_by(1) - v.begin(); #endif ASSERT( j==i, NULL ); v[j].bar() = int(~j); } vector_t copy_of_v(v); // should allocate first segment with same size as for shrink_to_fit() if(__TBB_Log2(/*reserved size*/old_size|1) > __TBB_Log2(fill_size|1) ) ASSERT( v.capacity() != copy_of_v.capacity(), NULL ); v.shrink_to_fit(); ASSERT( v.capacity() == copy_of_v.capacity(), NULL ); CheckVector(v, new_size*2, old_size); // check vector correctness ASSERT( v==copy_of_v, NULL ); // TODO: check also segments layout equality } ASSERT( FooCount==count, NULL ); } } ASSERT( allocator_t::items_allocated == allocator_t::items_freed, NULL); ASSERT( allocator_t::allocations == allocator_t::frees, NULL); }