/* Copyright 2018-2019 The MathWorks, Inc. */
#ifndef _KDTREE_
#define _KDTREE_

#ifndef LIBMWKDTREE_API
#define LIBMWKDTREE_API
#endif

#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
#endif

#ifdef MATLAB_MEX_FILE
#include "tmwtypes.h" /* mwSize is defined here */
#else
#include "rtwtypes.h"
#endif


EXTERN_C LIBMWKDTREE_API void kdtreeConstruct_single(void** ptr2ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeConstruct_double(void** ptr2ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeConstructRM_single(void** ptr2ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeConstructRM_double(void** ptr2ptrObj);

EXTERN_C LIBMWKDTREE_API boolean_T kdtreeNeedsReindex_single(void* ptrObj, void* pData);

EXTERN_C LIBMWKDTREE_API boolean_T kdtreeNeedsReindex_double(void* ptrObj, void* pData);

EXTERN_C LIBMWKDTREE_API boolean_T kdtreeNeedsReindexRM_single(void* ptrObj, void* pData);

EXTERN_C LIBMWKDTREE_API boolean_T kdtreeNeedsReindexRM_double(void* ptrObj, void* pData);

EXTERN_C LIBMWKDTREE_API void kdtreeIndex_single(void* ptrObj,
                                                 void* pData,
                                                 uint32_T dataSize,
                                                 uint32_T dims,
                                                 double numTrees,
                                                 double bucketSize,
                                                 double seed);

EXTERN_C LIBMWKDTREE_API void kdtreeIndex_double(void* ptrObj,
                                                 void* pData,
                                                 uint32_T dataSize,
                                                 uint32_T dims,
                                                 double numTrees,
                                                 double bucketSize,
                                                 double seed);

EXTERN_C LIBMWKDTREE_API void kdtreeIndexRM_single(void* ptrObj,
                                                   void* pData,
                                                   uint32_T dataSize,
                                                   uint32_T dims,
                                                   double numTrees,
                                                   double bucketSize,
                                                   double seed);

EXTERN_C LIBMWKDTREE_API void kdtreeIndexRM_double(void* ptrObj,
                                                   void* pData,
                                                   uint32_T dataSize,
                                                   uint32_T dims,
                                                   double numTrees,
                                                   double bucketSize,
                                                   double seed);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeBoxSearch_single(void* ptrObj,
                                                        void* roi,
                                                        void** resultIndices);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeBoxSearch_double(void* ptrObj,
                                                        void* roi,
                                                        void** resultIndices);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeBoxSearchRM_single(void* ptrObj,
                                                          void* roi,
                                                          void** resultIndices);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeBoxSearchRM_double(void* ptrObj,
                                                          void* roi,
                                                          void** resultIndices);

EXTERN_C LIBMWKDTREE_API void kdtreeBoxSearchSetOutputs(void* ptrIndices, uint32_T* location);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeKNNSearch_single(void* ptrObj,
                                                        void* queryData,
                                                        uint32_T numQueries,
                                                        uint32_T numQueryDims,
                                                        uint32_T knn,
                                                        double paramChecks,
                                                        float paramEps,
                                                        void* indices,
                                                        void* dists,
                                                        void* valid,
                                                        int32_T grainSize,
                                                        uint32_T tbbQueryThreshold);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeKNNSearch_double(void* ptrObj,
                                                        void* queryData,
                                                        uint32_T numQueries,
                                                        uint32_T numQueryDims,
                                                        uint32_T knn,
                                                        double paramChecks,
                                                        double paramEps,
                                                        void* indices,
                                                        void* dists,
                                                        void* valid,
                                                        int32_T grainSize,
                                                        uint32_T tbbQueryThreshold);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeKNNSearchRM_single(void* ptrObj,
                                                          void* queryData,
                                                          uint32_T numQueries,
                                                          uint32_T numQueryDims,
                                                          uint32_T knn,
                                                          double paramChecks,
                                                          float paramEps,
                                                          void* indices,
                                                          void* dists,
                                                          void* valid,
                                                          int32_T grainSize,
                                                          uint32_T tbbQueryThreshold);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeKNNSearchRM_double(void* ptrObj,
                                                          void* queryData,
                                                          uint32_T numQueries,
                                                          uint32_T numQueryDims,
                                                          uint32_T knn,
                                                          double paramChecks,
                                                          double paramEps,
                                                          void* indices,
                                                          void* dists,
                                                          void* valid,
                                                          int32_T grainSize,
                                                          uint32_T tbbQueryThresholds);


EXTERN_C LIBMWKDTREE_API int32_T kdtreeRadiusSearch_single(void* ptrObj,
                                                           void* queryData,
                                                           uint32_T numQueries,
                                                           uint32_T numQueryDims,
                                                           float radius,
                                                           double paramChecks,
                                                           float paramEps,
                                                           void** resultIndices,
                                                           void** resultDists,
                                                           uint32_T* valid,
                                                           int32_T grainSize,
                                                           uint32_T tbbQueryThresholds);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeRadiusSearch_double(void* ptrObj,
                                                           void* queryData,
                                                           uint32_T numQueries,
                                                           uint32_T numQueryDims,
                                                           double radius,
                                                           double paramChecks,
                                                           double paramEps,
                                                           void** resultIndices,
                                                           void** resultDists,
                                                           uint32_T* valid,
                                                           int32_T grainSize,
                                                           uint32_T tbbQueryThresholds);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeRadiusSearchRM_single(void* ptrObj,
                                                             void* queryData,
                                                             uint32_T numQueries,
                                                             uint32_T numQueryDims,
                                                             float radius,
                                                             double paramChecks,
                                                             float paramEps,
                                                             void** resultIndices,
                                                             void** resultDists,
                                                             uint32_T* valid,
                                                             int32_T grainSize,
                                                             uint32_T tbbQueryThresholds);

EXTERN_C LIBMWKDTREE_API int32_T kdtreeRadiusSearchRM_double(void* ptrObj,
                                                             void* queryData,
                                                             uint32_T numQueries,
                                                             uint32_T numQueryDims,
                                                             double radius,
                                                             double paramChecks,
                                                             double paramEps,
                                                             void** resultIndices,
                                                             void** resultDists,
                                                             uint32_T* valid,
                                                             int32_T grainSize,
                                                             uint32_T tbbQueryThresholds);

EXTERN_C LIBMWKDTREE_API void kdtreeRadiusSearchSetOutputs_single(void* ptrIndicesIn,
                                                                  void* ptrDistsIn,
                                                                  uint32_T* ptrIndicesOut,
                                                                  float* ptrDistsOut);

EXTERN_C LIBMWKDTREE_API void kdtreeRadiusSearchSetOutputs_double(void* ptrIndicesIn,
                                                                  void* ptrDistsIn,
                                                                  uint32_T* ptrIndicesOut,
                                                                  double* ptrDistsOut);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteObj_single(void* ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteObj_double(void* ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteObjRM_single(void* ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteObjRM_double(void* ptrObj);

EXTERN_C LIBMWKDTREE_API void kdtreeGetLocationDataPointer_single(void* locationData,
                                                                  uint32_T dataSize,
                                                                  uint32_T dims,
                                                                  void** ptr2locationDataPtr);

EXTERN_C LIBMWKDTREE_API void kdtreeGetLocationDataPointer_double(void* locationData,
                                                                  uint32_T dataSize,
                                                                  uint32_T dims,
                                                                  void** ptr2locationDataPtr);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteLocationDataPointer_single(void* locationPtr);

EXTERN_C LIBMWKDTREE_API void kdtreeDeleteLocationDataPointer_double(void* locationPtr);

#endif