// заголовочный файл функций поиска
#ifndef FINDUNIT
#define FINDUNIT

/*
 общее количество итераций поиска,
 обнуляется и заполняется каждой функцией поиска
 должна быть объявлена в основной программе или модуле
*/  
extern int find_count;

/*
 Тип тест-функции
 Для линейного поиска должна возвращать 0 или 1
 (0 - переданный элемент НЕ соответствует критериям поиска, 1 - соответствует)
 Для бинарного поиска должна возвращать 0, 1 или -1
 (0 - переданный элемент соответствует критериям поиска; 
  1,-1 - больше/меньше искомого элемента или наоборот в зависимости от решения программиста)
*/

 typedef int (*testfunc)(int);

/*
 Линейный поиск одного элемента в целочисленном массиве
 возвращает индекс найденного значения или -1
 Параметры:
 src - исходный массив
 src_size - кол-во элементов в src
 func - тест-функция
*/
int line_find_one(const int src[], int src_size, testfunc func);

/*
 Линейный поиск всех элементов в целочисленном массиве
 возвращает количество найденных элементов или 0
 Параметры:
 src - исходный массив
 src_size - кол-во элементов в src
 func - тест-функция
 result - массив найденных индексов
 result_maxsize - максимальное кол-во элементов в result
*/  
int line_find_all(const int src[], int src_size,  testfunc func, 
			      int result[], int result_maxsize);


/*
 Бинарный поиск одного элемента в целочисленном массиве
 возвращает индекс найденного значения или -1
 Параметры:
 src - исходный массив
 src_size - кол-во элементов в src
 func - тест-функция
*/  
int bin_find_one(const int src[], int src_size, testfunc func);

/*
 Бинарный поиск всех элементов в целочисленном массиве
 возвращает количество найденных элементов или 0
 Параметры:
 src - исходный массив
 src_size - кол-во элементов в src
 func - тест-функция
 res_beg - адрес переменной, куда будет сохранен индекс первого найденного элемента
 res_end - адрес переменной, куда будет сохранен индекс последнего найденного элемента
 поиск res_beg и res_end должен осуществляться бинарно.
*/  
int bin_find_all(const int src[], int src_size, testfunc func,
			      int *res_beg, int *res_end);

#endif // FINDUNIT
