void operator()( const RangeType& range ) const {
     for( typename RangeType::iterator i = range.begin(); i!=range.end(); ++i ) {
         int k = i->first.value_of();
         ASSERT( 0<=k && size_t(k)<n, NULL );
         ++array[k];
     }
 }
 void operator()( const RangeType& range ) const {
     for( typename RangeType::iterator i = range.begin(); i!=range.end(); ++i ) {
         int k = Value<ContainerType>::key(*i);
         ASSERT( k == Value<ContainerType>::get(*i), NULL );
         ASSERT( 0<=k && k<n, NULL ); 
         array[k]++;
     }
 }
 void operator()( const RangeType& range ) const {
     for( typename RangeType::iterator i = range.begin(); i!=range.end(); ++i ) {
         int k = i->first;
         ASSERT( k == i->second, NULL );
         ASSERT( 0<=k && k<n, NULL ); 
         array[k]++;
     }
 }
std::pair<int,int> CheckRecursiveRange(RangeType range) {
    std::pair<int,int> sum(0, 0); // count, sum
    for( Iterator i = range.begin(), e = range.end(); i != e; ++i ) {
        ++sum.first; sum.second += Value<ContainerType>::get(*i);
    }
    if( range.is_divisible() ) {
        RangeType range2( range, tbb::split() );
        std::pair<int,int> sum1 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range );
        std::pair<int,int> sum2 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range2 );
        sum1.first += sum2.first; sum1.second += sum2.second;
        ASSERT( sum == sum1, "Mismatched ranges after division");
    }
    return sum;
}