#include #include #include #include #include #include static void destroy_nodes (L3TDEMapNodePtr ***nodes, size_t x_len, size_t y_len); static void destroy_header (L3TDEMapHeaderPtr *header); static void destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len); L3TDEMapPtr l3tde_map_create (L3TDEMapHeaderPtr header, L3TDEMapNodePtr **nodes, size_t nodes_x_len, size_t nodes_y_len, L3TDEMapWarpPtr *warps, size_t warps_len) { L3TDEMapPtr self = malloc (sizeof *self); self->nodes_x_len = nodes_x_len; self->nodes_y_len = nodes_y_len; self->warps_len = warps_len; self->header = header; self->nodes = nodes; self->warps = warps; return self; } void l3tde_map_destroy (L3TDEMapPtr self) { destroy_nodes (&self->nodes, self->nodes_x_len, self->nodes_y_len); destroy_header (&self->header); destroy_warps (&self->warps, self->warps_len); free (self); } static void destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len) { if (*warps) { for (size_t i = 0; i < warps_len; i++) { if ((*warps)[i]) { l3tde_map_warp_destroy ((*warps)[i]); (*warps)[i] = NULL; } } free (*warps); warps = NULL; } } static void destroy_header (L3TDEMapHeaderPtr *header) { if (*header) { l3tde_map_header_destroy (*header); } header = NULL; } static void destroy_nodes (L3TDEMapNodePtr ***nodes, size_t x_len, size_t y_len) { if (*nodes) { for (size_t i = 0; i < x_len; i++) { if ((*nodes)[i]) { for (size_t j = 0; j < y_len; j++) { if ((*nodes)[i][j]) { l3tde_map_node_destroy ((*nodes)[i][j]); (*nodes)[i][j] = NULL; } } free ((*nodes)[i]); (*nodes)[i] = NULL; } } free ((*nodes)); nodes = NULL; } }