// // Created by Antoine Bartuccio on 05/06/2018. // #ifndef LO41_BUILDING_H #define LO41_BUILDING_H #define ELEVATOR_NB 3 #define FLOORS 25 #include "../Objects.h" #include "../List/List.h" #include "../Elevator/Elevator.h" #include "../Resident/Resident.h" #include "../Visitor/Visitor.h" typedef enum {RESIDENT, VISITOR} PASSENGER_TYPE; typedef union u_Passenger { Resident * resident; Visitor * visitor; } Passenger; typedef struct o_Building { PRIVATE int floors; PRIVATE List * residents; PRIVATE List * visitors; PRIVATE Elevator ** elevators; PRIVATE pthread_mutex_t * mutex_cond_get_inside_elevator; PRIVATE pthread_mutex_t * mutex_cond_get_outside_elevator; PRIVATE pthread_mutex_t * mutex_func_get_inside_elevator; PRIVATE pthread_cond_t ** condition_floors; PRIVATE void (*parse_residents)(_THIS(Building), char * file); PRIVATE void (*parse_visitors)(_THIS(Building), char * file); PRIVATE int (*get_inside_elevator)(_THIS(Building), int current_floor, Passenger passenger, PASSENGER_TYPE type); PUBLIC int (*use_call_box)(_THIS(Building), char * resident_name); PUBLIC void (*signal_elevator_at_floor)(_THIS(Building), int floor); SYNCHRONIZE PUBLIC void (*go_to_floor)(_THIS(Building), int origin, int destination, Passenger passenger, PASSENGER_TYPE type); DESTRUCTOR(Building); } Building; FRIENDLY(residents, SharedData) FRIENDLY(visitors, SharedData) FRIENDLY(elevators, SharedData) Building *_init_Building(char * residents_file, char * visitors_file); #endif //LO41_BUILDING_H