#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEF_LinkedList(T) \ 
	typedef struct _LinkedList##T{ \
		T value; \
		struct _LinkedList##T *next; \
	} LinkedList##T; \
	LinkedList##T *LinkedList##T##_New(const T *value){ \
		LinkedList##T *result = calloc(0, sizeof(LinkedList##T)); \
		memcpy(&result->value, value, sizeof(T)); \
		return  result; \
	} \
	void LinkedList##T##_Free(LinkedList##T *list) { \
		LinkedList##T *prev; \
		while(prev = list){ \
			list = list->next; \
			free(prev); \
		}  \
		free(list); \
	} \
	LinkedList##T *LinkedList##T##_Top(LinkedList##T *list){ \
		if(!list) NULL; \
		while(list->next) list = list->next; \
		return list; \
	}\
	int LinkedList##T##_Push(LinkedList##T *list, const T *value){ \
		if(list == NULL) return LinkedList##T##_New(value); \
		LinkedList##T *top = LinkedList##T##_Top(list); \
		top->next = LinkedList##T##_New(value); \
		return list; \
	} \
	void LinkedList##T##_ForEach(const LinkedList##T *list, void(*op)(const T *)){ \
		while(list){ \
			op(&list->value); \
			list = list->next; \
		} \
	}
	
typedef int Int;
DEF_LinkedList(Int);
	

void printOp(const int *v){
	printf("%i", *v);
}

int main(void) {
	LinkedListInt *list;
	int i;
	for(i = 0; i <= 10; ++i)
		list = LinkedListInt_Push(list, &i);
		
	LinkedListInt_ForEach(list, printOp);
	
	LinkedListInt_Free(list);
	return 0;
}
