From dfea5e24ad437db6807196c986c6eb9ed33b52c6 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 28 Jun 2022 13:11:44 +0200 Subject: BLI: add kdtree range search method that accepts c++ lambda This is easier to use in C++ code compared to passing a function and user-data separately. --- source/blender/blenlib/BLI_kdtree_impl.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'source/blender/blenlib/BLI_kdtree_impl.h') diff --git a/source/blender/blenlib/BLI_kdtree_impl.h b/source/blender/blenlib/BLI_kdtree_impl.h index 08fa40fd972..4187724fbda 100644 --- a/source/blender/blenlib/BLI_kdtree_impl.h +++ b/source/blender/blenlib/BLI_kdtree_impl.h @@ -12,6 +12,10 @@ #define _BLI_CONCAT(MACRO_ARG1, MACRO_ARG2) _BLI_CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) #define BLI_kdtree_nd_(id) _BLI_CONCAT(KDTREE_PREFIX_ID, _##id) +#ifdef __cplusplus +extern "C" { +#endif + struct KDTree; typedef struct KDTree KDTree; @@ -80,6 +84,29 @@ int BLI_kdtree_nd_(range_search_with_len_squared_cb)( const void *user_data), const void *user_data) ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT; +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +template +inline void BLI_kdtree_nd_(range_search_cb_cpp)(const KDTree *tree, + const float co[KD_DIMS], + float distance, + const Fn &fn) +{ + BLI_kdtree_nd_(range_search_cb)( + tree, + co, + distance, + [](void *user_data, const int index, const float *co, const float dist_sq) { + const Fn &fn = *static_cast(user_data); + return fn(index, co, dist_sq); + }, + const_cast(&fn)); +} +#endif + #undef _BLI_CONCAT_AUX #undef _BLI_CONCAT #undef BLI_kdtree_nd_ -- cgit v1.2.3