From b3f0f330801f612e23fea6d4c0e6cb90d42d785b Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 31 Jul 2024 12:05:19 +0200
Subject: [PATCH] + FieldUtil::make

---
 Base/Type/Field2D.h | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/Base/Type/Field2D.h b/Base/Type/Field2D.h
index 185ad7f0ada..e4715072ea0 100644
--- a/Base/Type/Field2D.h
+++ b/Base/Type/Field2D.h
@@ -15,6 +15,7 @@
 #ifndef BORNAGAIN_BASE_TYPE_FIELD2D_H
 #define BORNAGAIN_BASE_TYPE_FIELD2D_H
 
+#include <functional>
 #include <heinz/Complex.h>
 #include <vector>
 
@@ -25,24 +26,31 @@ using complex2d_t = Field2D<complex_t>;
 
 namespace FieldUtil {
 
-template <typename C> std::vector<C> flatten(const Field2D<C>& src)
+template <typename T> std::vector<T> flatten(const Field2D<T>& src)
 {
-    std::vector<C> result;
+    std::vector<T> result;
     for (const auto& row : src)
         result.insert(result.end(), row.begin(), row.end());
     return result;
 }
 
-template <typename C> Field2D<C> reshapeTo2D(const std::vector<C>& src, size_t n_rows)
+template <typename T>
+Field2D<T> make(size_t n_rows, size_t n_cols, std::function<T(size_t, size_t)> setter)
 {
-    size_t n_cols = src.size() / n_rows;
-    Field2D<C> result(n_rows);
-
+    Field2D<T> result(n_rows, std::vector<T>(n_cols));
     for (size_t i = 0; i < n_rows; i++)
-        result[i].insert(result[i].end(), src.begin() + i * n_cols, src.begin() + (i + 1) * n_cols);
+        for (size_t j = 0; j < n_cols; j++)
+            result[i][j] = setter(i, j);
     return result;
 }
 
+template <typename T> Field2D<T> reshapeTo2D(const std::vector<T>& src, size_t n_rows)
+{
+    size_t n_cols = src.size() / n_rows;
+    return make<T>(n_rows, n_cols,
+                   [&src, n_cols](size_t i, size_t j) -> T { return src[i * n_cols + j]; });
+}
+
 } // namespace FieldUtil
 
 #endif // BORNAGAIN_BASE_TYPE_FIELD2D_H
-- 
GitLab