#include <stdio.h>
#include <time.h>

clock_t t;

void tic() {
	t = clock(); 
}

void toc() {
	printf("elapsed: %d\n",  clock() - t );
}


//это то, что делается при мономорфизации - типы можно передавать по значению
//код может инлайниться, а может и нет
void shablonnoe_petushenie(int a, int b, int* c) {
	*c = a + b;
}

// а вот это - трушный параметрический полиморфизм
// который можно и в dll запихнуть, например, т.е. неплохая штука для построения
// плагинов. Все лежит в коробке
typedef struct Dict_tag {
    void (*add)(void*a, void* b, void* c);
} Dict;

void bozhestvenniy_slovar(int* a, int* b, int* c) {
	*c = *a + *b;
}

Dict intdict = { .add = &bozhestvenniy_slovar };


// код

int main() {
	int SIZE = 100000000;
	
	int* yoba = malloc(SIZE * sizeof(int));

	for (int i = 0; i < SIZE; ++i) {
		yoba[i] = i;
	}
	
	tic();
	int sum1 = 0;
	for (int i = 0; i < SIZE; ++i) {
		intdict.add(&sum1, &yoba[i], &sum1);
	}
	toc();
	printf("%d\n", sum1);

	tic();
	int sum2 = 0;
	for (int i = 0; i < SIZE; ++i) {
		shablonnoe_petushenie(sum2, yoba[i], &sum2);
	}
	toc();
	printf("%d\n", sum2);	
	


	free(yoba);	
	return 0;
}