From 65e2d47d0728a59ca44d3bfa7c8648b79f22bc5f Mon Sep 17 00:00:00 2001
From: Sebastiaan van der Tol <tol@astron.nl>
Date: Wed, 8 Nov 2023 07:01:13 +0100
Subject: [PATCH] Add sdp_element to ska-sdp-func-bindings

---
 cpp/ska-sdp-func-bindings/CMakeLists.txt      |  5 ++-
 cpp/ska-sdp-func-bindings/sdp_element.cc      | 41 +++++++++++++++++++
 cpp/ska-sdp-func-bindings/sdp_element.h       | 30 ++++++++++++++
 .../skasdpfuncelementresponse.h               |  2 +-
 .../skasdpfunceverybeam.h                     |  2 +-
 cpp/ska-sdp-func-bindings/tbindings.cc        |  2 +-
 6 files changed, 77 insertions(+), 5 deletions(-)
 create mode 100644 cpp/ska-sdp-func-bindings/sdp_element.cc
 create mode 100644 cpp/ska-sdp-func-bindings/sdp_element.h

diff --git a/cpp/ska-sdp-func-bindings/CMakeLists.txt b/cpp/ska-sdp-func-bindings/CMakeLists.txt
index 278cc6a4..f2b100c7 100644
--- a/cpp/ska-sdp-func-bindings/CMakeLists.txt
+++ b/cpp/ska-sdp-func-bindings/CMakeLists.txt
@@ -1,7 +1,7 @@
 # Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy)
 # SPDX-License-Identifier: GPL-3.0-or-later
 
-add_library(ska-sdp-func-everybeam OBJECT skasdpfunceverybeam.cc
+add_library(ska-sdp-func-everybeam OBJECT sdp_element.cc skasdpfunceverybeam.cc
                                           skasdpfuncelementresponse.cc)
 
 # The ska-sdp-func-everybeam object library is included in the SHARED library everybeam
@@ -11,7 +11,8 @@ set_property(TARGET ska-sdp-func-everybeam PROPERTY POSITION_INDEPENDENT_CODE
 
 target_link_libraries(ska-sdp-func-everybeam ska-sdp-func::ska-sdp-func xtensor)
 
-install(FILES skasdpfunceverybeam.h DESTINATION "include/${CMAKE_PROJECT_NAME}")
+install(FILES skasdpfunceverybeam.h sdp_element.h
+        DESTINATION "include/${CMAKE_PROJECT_NAME}")
 
 add_executable(tbindings tbindings.cc)
 target_link_libraries(tbindings everybeam ska-sdp-func::ska-sdp-func)
diff --git a/cpp/ska-sdp-func-bindings/sdp_element.cc b/cpp/ska-sdp-func-bindings/sdp_element.cc
new file mode 100644
index 00000000..ad53898c
--- /dev/null
+++ b/cpp/ska-sdp-func-bindings/sdp_element.cc
@@ -0,0 +1,41 @@
+#include "sdp_element.h"
+
+#include <map>
+#include <string>
+
+namespace {
+std::map<std::string,
+         std::tuple<make_function_t, destroy_function_t, evaluate_function_t>>&
+get_sdp_element_function_map() {
+  static std::map<std::string, std::tuple<make_function_t, destroy_function_t,
+                                          evaluate_function_t>>
+      function_map;
+  return function_map;
+}
+}  // namespace
+
+int sdp_register_element(const char* name, const make_function_t make_function,
+                         const destroy_function_t destroy_function,
+                         const evaluate_function_t evaluate_function) {
+  std::map<std::string, std::tuple<make_function_t, destroy_function_t,
+                                   evaluate_function_t>>& function_map =
+      get_sdp_element_function_map();
+  function_map[name] =
+      std::make_tuple(make_function, destroy_function, evaluate_function);
+  return 0;
+}
+
+sdp_Error sdp_get_element_functions(const char* name,
+                                    make_function_t& make_function,
+                                    destroy_function_t& destroy_function,
+                                    evaluate_function_t& evaluate_function) {
+  std::map<std::string, std::tuple<make_function_t, destroy_function_t,
+                                   evaluate_function_t>>& function_map =
+      get_sdp_element_function_map();
+
+  if (!function_map.count(name)) return SDP_ERR_INVALID_ARGUMENT;
+
+  std::tie(make_function, destroy_function, evaluate_function) =
+      function_map[name];
+  return SDP_SUCCESS;
+}
diff --git a/cpp/ska-sdp-func-bindings/sdp_element.h b/cpp/ska-sdp-func-bindings/sdp_element.h
new file mode 100644
index 00000000..74111c44
--- /dev/null
+++ b/cpp/ska-sdp-func-bindings/sdp_element.h
@@ -0,0 +1,30 @@
+#include <ska-sdp-func/utility/sdp_errors.h>
+#include <ska-sdp-func/utility/sdp_mem.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* sdp_element_t;
+
+typedef sdp_element_t (*make_function_t)(const char* name);
+
+typedef void (*destroy_function_t)(sdp_element_t element_response);
+
+typedef void (*evaluate_function_t)(sdp_element_t element_response,
+                                    int num_points, const sdp_Mem* theta,
+                                    const sdp_Mem* phi, sdp_Mem* response);
+
+[[gnu::visibility("default")]] int sdp_register_element(
+    const char* name, const make_function_t make_function,
+    const destroy_function_t destroy_function,
+    const evaluate_function_t evaluate_function);
+
+[[gnu::visibility("default")]] sdp_Error sdp_get_element_functions(
+    const char* name, make_function_t& make_function,
+    destroy_function_t& destroy_function,
+    evaluate_function_t& evaluate_function);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cpp/ska-sdp-func-bindings/skasdpfuncelementresponse.h b/cpp/ska-sdp-func-bindings/skasdpfuncelementresponse.h
index a87ede23..d20f4f01 100644
--- a/cpp/ska-sdp-func-bindings/skasdpfuncelementresponse.h
+++ b/cpp/ska-sdp-func-bindings/skasdpfuncelementresponse.h
@@ -8,7 +8,7 @@
 
 #include <memory>
 
-#include <ska-sdp-func/station_beam/sdp_element.h>
+#include "sdp_element.h"
 
 namespace everybeam {
 
diff --git a/cpp/ska-sdp-func-bindings/skasdpfunceverybeam.h b/cpp/ska-sdp-func-bindings/skasdpfunceverybeam.h
index 931b7923..630bc124 100644
--- a/cpp/ska-sdp-func-bindings/skasdpfunceverybeam.h
+++ b/cpp/ska-sdp-func-bindings/skasdpfunceverybeam.h
@@ -1,4 +1,4 @@
-#include <ska-sdp-func/station_beam/sdp_element.h>
+#include "sdp_element.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/cpp/ska-sdp-func-bindings/tbindings.cc b/cpp/ska-sdp-func-bindings/tbindings.cc
index 0452a2d3..9413e9a6 100644
--- a/cpp/ska-sdp-func-bindings/tbindings.cc
+++ b/cpp/ska-sdp-func-bindings/tbindings.cc
@@ -1,4 +1,4 @@
-#include "ska-sdp-func/station_beam/sdp_element.h"
+#include "sdp_element.h"
 
 #include <complex>
 #include <dlfcn.h>
-- 
GitLab