#ifndef fonctions_h
#define fonctions_h

typedef struct node {
    uint64_t value;
    struct node *next;
} node_t;

typedef struct list {
    node_t *first;
    node_t *last;
    int length;
} list_t;

typedef struct node2 {
    list_t *diviseurs;
    struct node2 *next;
} node_lst;

typedef struct list2 {
    node_lst *first;
    node_lst *last;
    int length;
} list_lst;

typedef struct buffer1 {
    list_t *numbers;
    sem_t free;
    sem_t full;
    pthread_mutex_t mutex;
    bool can_stop;
} buffer1;

typedef struct buffer2 {
    list_lst *prime_numbers;
    sem_t free;
    sem_t full;
    pthread_mutex_t mutex;
} buffer2;

void init_list_t(list_t *my_list);
void init_list_lst(list_lst *my_list);

void put_node_t(list_t *my_list, uint64_t value);
void put_node_lst(list_lst *my_list, list_t *put_list);

uint64_t get_node_t(list_t *my_list);
list_t *get_node_lst(list_lst *my_list);

void clear_list_t(list_t *my_list);

list_t *prime_list(uint64_t value);

int count_lines(char *filename);

buffer1 *init_buffer_1(int nthreads);
buffer2 *init_buffer_2(int nthreads);

#endif //fonctions_h