From 03ff113ac48f21956247b164a83000b5f6ab311d Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Tue, 25 Sep 2018 18:24:57 +0200
Subject: Add support for checking features at run-time

---
 matlab/mex/astra_mex_c.cpp | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

(limited to 'matlab')

diff --git a/matlab/mex/astra_mex_c.cpp b/matlab/mex/astra_mex_c.cpp
index f494ce6..43c438e 100644
--- a/matlab/mex/astra_mex_c.cpp
+++ b/matlab/mex/astra_mex_c.cpp
@@ -35,6 +35,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
 #include "mexInitFunctions.h"
 
 #include "astra/Globals.h"
+#include "astra/Features.h"
 #include "astra/AstraObjectManager.h"
 
 #ifdef ASTRA_CUDA
@@ -132,6 +133,7 @@ void astra_mex_set_gpu_index(int nlhs, mxArray* plhs[], int nrhs, const mxArray*
 #endif
 }
 
+//-----------------------------------------------------------------------------------------
 /** get_gpu_info = astra_mex('get_gpu_info');
  * 
  * Get GPU info
@@ -148,6 +150,38 @@ void astra_mex_get_gpu_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray*
 }
 
 
+//-----------------------------------------------------------------------------------------
+/** has_feature = astra_mex('has_feature');
+ *
+ * Check a feature flag. See include/astra/Features.h.
+ */
+void astra_mex_has_feature(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
+{
+	if (2 > nrhs) {
+		mexErrMsgTxt("Usage: astra_mex('has_feature', feature);\n");
+		return;
+	}
+
+	string sMode = mexToString(prhs[0]);
+	bool ret = false;
+
+	// NB: When adding features here, also document them centrally in
+	// include/astra/Features.h
+	if (sMode == "mex_link") {
+#ifdef USE_MATLAB_UNDOCUMENTED
+		ret = true;
+#else
+		ret = false;
+#endif
+	} else {
+		ret = astra::hasFeature(sMode);
+	}
+
+	plhs[0] = mxCreateDoubleScalar(ret ? 1 : 0);
+}
+
+
+
 //-----------------------------------------------------------------------------------------
 /** version_number = astra_mex('version');
  * 
@@ -208,7 +242,7 @@ void astra_mex_delete(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]
 static void printHelp()
 {
 	mexPrintf("Please specify a mode of operation.\n");
-	mexPrintf("   Valid modes: version, use_cuda, credits, set_gpu_index, info, delete\n");
+	mexPrintf("   Valid modes: version, use_cuda, credits, set_gpu_index, has_feature, info, delete\n");
 }
 
 //-----------------------------------------------------------------------------------------
@@ -241,6 +275,8 @@ void mexFunction(int nlhs, mxArray* plhs[],
 		astra_mex_set_gpu_index(nlhs, plhs, nrhs, prhs);
 	} else if (sMode == std::string("get_gpu_info")) {
 		astra_mex_get_gpu_info(nlhs, plhs, nrhs, prhs);
+	} else if (sMode == std::string("has_feature")) {
+		astra_mex_has_feature(nlhs, plhs, nrhs, prhs);
 	} else if (sMode == std::string("info")) {
 		astra_mex_info(nlhs, plhs, nrhs, prhs);
 	} else if (sMode == std::string("delete")) {
-- 
cgit v1.2.3