From 543314c14fe5220eff00de47bdcdd5fa00ae53e2 Mon Sep 17 00:00:00 2001
From: Andreas Gattringer <andreas.gattringer@univie.ac.at>
Date: Wed, 19 Jul 2023 14:23:50 +0200
Subject: [PATCH] annotate and reduce array access code locations

---
 src/cats/grids/gdal_save.c  |  2 +-
 src/cats/grids/grid_setup.c |  2 +-
 src/cats/inline.h           | 21 +++++++++++++++++----
 src/cats/misc/debug.c       | 12 +++++++-----
 src/cats_csv/cats_csv.c     | 11 +++++------
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/cats/grids/gdal_save.c b/src/cats/grids/gdal_save.c
index b6d2534..ba02526 100644
--- a/src/cats/grids/gdal_save.c
+++ b/src/cats/grids/gdal_save.c
@@ -132,7 +132,7 @@ void *save_dispersed_seeds_to_gdal(struct cats_grid *grid, struct cats_configura
         const int32_t cols = grid->dimension.cols;
         for (cats_dt_coord row = 0; row < rows; row++) {
                 for (cats_dt_coord col = 0; col < cols; col++) {
-                        seeds[row][col] = grid->dispersed_seeds[row][col];
+                        seeds[row][col] = get_dispersed_seeds(grid, row, col);
                 }
         }
 
diff --git a/src/cats/grids/grid_setup.c b/src/cats/grids/grid_setup.c
index e8b72b4..5c31dcd 100644
--- a/src/cats/grids/grid_setup.c
+++ b/src/cats/grids/grid_setup.c
@@ -56,7 +56,7 @@ void setup_grid_seed_structures(const struct cats_configuration *conf, struct ca
                 grid->seed_bank[row] = calloc_or_die(cols, sizeof(cats_dt_seeds *));
 
                 for (cats_dt_coord col = 0; col < cols; col++) {
-                        grid->seed_bank[row][col] = NULL;
+                        grid->seed_bank[row][col] = NULL;  // initialisation [setup_grid_seed_structure]
                 }
         }
 }
diff --git a/src/cats/inline.h b/src/cats/inline.h
index 1e3606b..2f3f406 100644
--- a/src/cats/inline.h
+++ b/src/cats/inline.h
@@ -44,19 +44,32 @@
 #include "inline_vital_ages.h"
 #include "grids/dimensions.h"
 
+static inline bool valid_dispersed_seed_grid(const struct cats_grid *grid, cats_dt_coord row)
+{
+        if (grid == NULL) return false;
+        if (grid->dispersed_seeds == NULL) return false;
+        if (grid->dispersed_seeds[row] == NULL) return false;       // validator [valid_population_grid]
+        return true;
+}
+
 
 static inline cats_dt_environment
 get_suitability_from_env(const struct cats_environment *set, cats_dt_coord row, cats_dt_coord col)
 {
         assert(set->type == ENVIRONMENT_TYPE_SUITABILITY);
         assert(set->count == 1);
-        assert(row >= 0);
-        assert(col >= 0);
-        assert(row < set->environments[0]->current.dimension.rows);
-        assert(col < set->environments[0]->current.dimension.cols);
+        assert(valid_coordinates(&set->environments[0]->current.dimension, row, col));
         return load_input_environment_raster(&set->environments[0]->current, row, col);
 }
 
+static inline cats_dt_seeds
+get_dispersed_seeds(const struct cats_grid *grid, cats_dt_coord row, cats_dt_coord col)
+{
+        assert(valid_coordinates(&grid->dimension, row, col));
+        assert(valid_dispersed_seed_grid(grid, row));
+        return grid->dispersed_seeds[row][col];  // get [get_dispersed_seeds]
+}
+
 
 static inline void
 set_suitability(struct cats_grid *grid, cats_dt_coord row, cats_dt_coord col, cats_dt_environment value)
diff --git a/src/cats/misc/debug.c b/src/cats/misc/debug.c
index acc0c16..4900cc3 100644
--- a/src/cats/misc/debug.c
+++ b/src/cats/misc/debug.c
@@ -28,6 +28,12 @@
 #include <memory/cats_memory.h>
 
 
+static inline cats_dt_population debug_get_juveniles(const struct cats_grid *grid, cats_dt_coord row, cats_dt_coord col, int year)
+{
+        if (grid->juveniles[row][col] == NULL) return 0;
+        return grid->juveniles[row][col][year];
+}
+
 void
 debug_juveniles(const struct cats_grid *grid, const struct cats_configuration *conf, cats_dt_coord row,
                 cats_dt_coord col, const char *action)
@@ -38,11 +44,7 @@ debug_juveniles(const struct cats_grid *grid, const struct cats_configuration *c
                 const int32_t max_age_of_maturity = get_vital_age(grid, VA_AGE_OF_MATURITY_MAX);
 
                 for (int32_t i = 0; i < max_age_of_maturity + 1; i++) {
-                        if (grid->juveniles[row][col]) {
-                                fprintf(cats_debug.misc_debug_file, ",%d", grid->juveniles[row][col][i]);
-                        } else {
-                                fprintf(cats_debug.misc_debug_file, ",%d", 0);
-                        }
+                        fprintf(cats_debug.misc_debug_file, ",%d", debug_get_juveniles(grid, row, col, i));
                 }
 
                 fprintf(cats_debug.misc_debug_file, "\n");
diff --git a/src/cats_csv/cats_csv.c b/src/cats_csv/cats_csv.c
index 676cf32..57b45d9 100644
--- a/src/cats_csv/cats_csv.c
+++ b/src/cats_csv/cats_csv.c
@@ -89,8 +89,8 @@ void csv_free(struct cats_csv **csv)
                         if (this->data[row] == NULL) continue;
 
                         for (int32_t col = 0; col < this->column_count; col++) {
-                                free(this->data[row][col]);
-                                this->data[row][col] = NULL;
+                                free(this->data[row][col]);     // clean-up, non-spatial [csv_free]
+                                this->data[row][col] = NULL;    // clean-up, non-spatial [csv_free]
                         }
 
                         free(this->data[row]);
@@ -142,7 +142,7 @@ char *csv_get_value_field_name(struct cats_csv *csv, int32_t row, const char *fi
                 exit(EXIT_FAILURE);
         }
 
-        return csv->data[row][field_idx];
+        return csv->data[row][field_idx];  // getter, non-spatial [csv_get_value_field_name]
 }
 
 
@@ -164,7 +164,7 @@ char *csv_get_value_field_idx(struct cats_csv *csv, int32_t row, int32_t field_i
                 exit(EXIT_FAILURE);
         }
 
-        return csv->data[row][field_idx];
+        return csv->data[row][field_idx]; // getter, non-spatial [csv_get_value_field_idx]
 }
 
 
@@ -242,8 +242,7 @@ void csv_add_row(struct cats_csv *csv, char *line)
         csv->data[row] = malloc_or_die_trace(fields * sizeof(char *), __func__);
 
         for (int32_t i = 0; i < csv->column_count; i++) {
-                csv->data[row][i] = strdup(data->string[i]);
-
+                csv->data[row][i] = strdup(data->string[i]);  // initialisation, non-spatial [csv_add_row]
         }
 
         free_string_array(&data);
-- 
GitLab