#ifndef CA_UWATERLOO_ALUMNI_DWHARDER_SEARCHING_ALGORITHMS_BINARY_SEARCH_POINTER #define CA_UWATERLOO_ALUMNI_DWHARDER_SEARCHING_ALGORITHMS_BINARY_SEARCH_POINTER #include "Linear_search_pointer.h" namespace Searching_algorithms { namespace Binary_search { int const POINTER_USE_LINEAR = 18; class Pointer { public: template static bool search( Type const &obj, Type *array, int n ) { if ( obj < array[0] || array[n - 1] < obj ) { return false; } return search_iterative( obj, array, array + n - 1 ); } template static bool search( Type const &obj, Type *array, int a, int b ) { if ( obj < array[a] || array[b] < obj ) { return false; } return search_iterative( obj, array + a, array + b ); } template static bool search( Type const &obj, Type *a, Type *b ) { if ( obj < *a || *b < obj ) { return false; } return search_iterative( obj, a, b ); } private: template static bool search_iterative( Type const &obj, Type *a, Type *c ) { while ( a + POINTER_USE_LINEAR <= c ) { Type *b = a + ((c - a) >> 1); if ( *b == obj ) { return true; } else if ( obj < *b ) { c = b - 1; } else { a = b + 1; } } return Searching_algorithms::Linear_search::Pointer::search( obj, a, c ); } }; } } #endif