#include <stdio.h>
#include <stdbool.h>
/*
find_if_not:
Returns a pointer to the first element in the array that does NOT satisfy
the given predicate.
Parameters:
arr - pointer to the array
n - number of elements in the array
predicate - function pointer returning true for elements that satisfy
the condition
Returns:
Pointer to the first element for which predicate(element) == false.
If all elements satisfy the predicate, returns NULL.
This is the idiomatic C equivalent of C++'s std::find_if_not.
*/
int* find_if_not(const int *arr, size_t n, bool (*predicate)(int)) {
for (size_t i = 0; i < n; i++) {
if (!predicate(arr[i])) {
/* Cast away const so caller can modify if desired */
return (int*)&arr[i];
}
}
return NULL;
}
/* Predicate: returns true if number is positive */
bool is_positive(int x) {
return x > 0;
}
/* Predicate: returns true if number is even */
bool is_even(int x) {
return (x % 2) == 0;
}
int main(void) {
int data[] = {2, 4, 7, 6, -1, 8, 10, -3};
size_t n = sizeof(data) / sizeof(data[0]);
/* First test: find first element NOT positive */
int *p1 = find_if_not(data, n, is_positive);
if (p1) {
printf("First element NOT positive: %d\n", *p1);
} else {
printf("All elements are positive\n");
}
/* Second test: find first element NOT even */
int *p2 = find_if_not(data, n, is_even);
if (p2) {
printf("First element NOT even: %d\n", *p2);
} else {
printf("All elements are even\n");
}
return 0;
}
/*
run:
First element NOT positive: -1
First element NOT even: 7
*/