Imported Upstream version 1.7.0

parent 9e035c0f
#
# top-level CMake configuration file for PDAL
#
# (based originally on the libLAS files copyright Mateusz Loskot)
cmake_minimum_required(VERSION 2.6.0)
project(spatialindex)
#------------------------------------------------------------------------------
# internal cmake settings
#------------------------------------------------------------------------------
set(CMAKE_COLOR_MAKEFILE ON)
# Allow advanced users to generate Makefiles printing detailed commands
mark_as_advanced(CMAKE_VERBOSE_MAKEFILE)
# Path to additional CMake modules
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
#------------------------------------------------------------------------------
# libspatialindex general settings
#------------------------------------------------------------------------------
SET(SIDX_VERSION_MAJOR "1")
SET(SIDX_VERSION_MINOR "7")
SET(SIDX_VERSION_PATCH "0")
set(SIDX_VERSION_STRING "${SIDX_VERSION_MAJOR}.${SIDX_VERSION_MINOR}.${SIDX_VERSION_PATCH}")
SET(SIDX_LIB_SOVERSION ${SIDX_VERSION_MAJOR})
SET(SIDX_C_LIB_SOVERSION ${SIDX_VERSION_MAJOR})
# Name of C++ library
set(SIDX_LIB_NAME spatialindex)
set(SIDX_C_LIB_NAME spatialindex_c)
set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
include (CheckFunctionExists)
check_function_exists(srand48 HAVE_SRAND48)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(bzero HAVE_BZERO)
check_function_exists(memset HAVE_MEMSET)
check_function_exists(memcpy HAVE_MEMCPY)
check_function_exists(bcopy HAVE_BCOPY)
if (HAVE_SRAND48)
add_definitions(-DHAVE_SRAND48=1)
endif()
if (HAVE_GETTIMEOFDAY)
add_definitions(-DHAVE_GETTIMEOFDAY=1)
endif()
if (HAVE_BZERO)
add_definitions(-DHAVE_BZERO=1)
endif()
if (HAVE_MEMSET)
add_definitions(-DHAVE_MEMSET=1)
endif()
if (HAVE_MEMCPY)
add_definitions(-DHAVE_MEMCPY=1)
endif()
if (HAVE_BCOPY)
add_definitions(-DHAVE_BCOPY=1)
endif()
# Choose to use pkg-config or not
#set(WITH_PKGCONFIG FALSE CACHE BOOL
# "Choose whether a pkgconfig file (PDAL.pc) should be installed")
#------------------------------------------------------------------------------
# General build settings
#------------------------------------------------------------------------------
# note we default to debug mode
if(NOT MSVC_IDE)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel" FORCE)
endif()
message(STATUS "Setting libspatialindex build type - ${CMAKE_BUILD_TYPE}")
endif()
set(SIDX_BUILD_TYPE ${CMAKE_BUILD_TYPE})
# TODO: Still testing the output paths --mloskot
set(SIDX_BUILD_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
# Output directory in which to build RUNTIME target files.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${SIDX_BUILD_OUTPUT_DIRECTORY})
# Output directory in which to build LIBRARY target files
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${SIDX_BUILD_OUTPUT_DIRECTORY})
# Output directory in which to build ARCHIVE target files.
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${SIDX_BUILD_OUTPUT_DIRECTORY})
#------------------------------------------------------------------------------
# Platform and compiler specific settings
#------------------------------------------------------------------------------
if(WIN32)
if (MSVC)
if (MSVC80 OR MSVC90 OR MSVC10)
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
add_definitions(-D_CRT_NONSTDC_NO_WARNING)
add_definitions(-D_SCL_SECURE_NO_WARNINGS)
add_definitions(-DSPATIALINDEX_CREATE_DLL=1)
set(SIDX_COMPILER_MSVC 1)
if (MSVC10)
set(SIDX_COMPILER_VC10 1)
elseif (MSVC9)
set(SIDX_COMPILER_VC9 1)
elseif (MSVC8)
set(SIDX_COMPILER_VC8 1)
endif()
endif()
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4"
CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
endif()
set(CMAKE_INCLUDE_PATH c:/osgeo4w/include;$ENV{CMAKE_INCLUDE_PATH})
set(CMAKE_LIBRARY_PATH c:/osgeo4w/lib;$ENV{CMAKE_LIBRARY_PATH})
set(SIDX_OS_WIN32 1)
else()
# not WIN32
# Recommended C++ compilation flags
# -Weffc++
set(SIDX_COMMON_CXX_FLAGS
"-pedantic -Wall -Wpointer-arith -Wcast-align -Wcast-qual -Wredundant-decls -Wno-long-long")
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SIDX_COMMON_CXX_FLAGS}")
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -ansi")
endif()
set(SIDX_COMPILER_GCC 1)
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER}" MATCHES "clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SIDX_COMMON_CXX_FLAGS}")
set(SIDX_COMPILER_CLANG 1)
endif()
endif(WIN32)
if (APPLE)
set(SO_EXT dylib)
set(CMAKE_FIND_FRAMEWORK "LAST")
elseif(WIN32)
set(SO_EXT dll)
else()
set(SO_EXT so)
endif(APPLE)
#------------------------------------------------------------------------------
# installation path settings
#------------------------------------------------------------------------------
if(WIN32)
set(DEFAULT_LIB_SUBDIR lib)
set(DEFAULT_DATA_SUBDIR .)
set(DEFAULT_INCLUDE_SUBDIR include)
if (MSVC)
set(DEFAULT_BIN_SUBDIR bin)
else()
set(DEFAULT_BIN_SUBDIR .)
endif()
else()
# Common locations for Unix and Mac OS X
set(DEFAULT_BIN_SUBDIR bin)
set(DEFAULT_LIB_SUBDIR lib${LIB_SUFFIX})
set(DEFAULT_DATA_SUBDIR share/libspatialindex)
set(DEFAULT_INCLUDE_SUBDIR include)
endif()
# Locations are changeable by user to customize layout of SIDX installation
# (default values are platform-specific)
set(SIDX_BIN_SUBDIR ${DEFAULT_BIN_SUBDIR} CACHE STRING
"Subdirectory where executables will be installed")
set(SIDX_LIB_SUBDIR ${DEFAULT_LIB_SUBDIR} CACHE STRING
"Subdirectory where libraries will be installed")
set(SIDX_INCLUDE_SUBDIR ${DEFAULT_INCLUDE_SUBDIR} CACHE STRING
"Subdirectory where header files will be installed")
set(SIDX_DATA_SUBDIR ${DEFAULT_DATA_SUBDIR} CACHE STRING
"Subdirectory where data will be installed")
# Mark *_SUBDIR variables as advanced and dedicated to use by power-users only.
mark_as_advanced(SIDX_BIN_SUBDIR
SIDX_LIB_SUBDIR SIDX_INCLUDE_SUBDIR SIDX_DATA_SUBDIR)
# Full paths for the installation
set(SIDX_BIN_DIR ${SIDX_BIN_SUBDIR})
set(SIDX_LIB_DIR ${SIDX_LIB_SUBDIR})
set(SIDX_INCLUDE_DIR ${SIDX_INCLUDE_SUBDIR})
set(SIDX_DATA_DIR ${SIDX_DATA_SUBDIR})
#------------------------------------------------------------------------------
# subdirectory controls
#------------------------------------------------------------------------------
add_subdirectory(src)
add_subdirectory(test)
#------------------------------------------------------------------------------
# finally, generate the pdal_config.h header
#------------------------------------------------------------------------------
#
# configure_file(
# "${PROJECT_SOURCE_DIR}/pdal_defines.h.in"
# "${PROJECT_SOURCE_DIR}/include/pdal/pdal_defines.h")
This diff is collapsed.
## Makefile.am -- Process this file with automake to produce Makefile.in
SUBDIRS = src . regressiontest include
SUBDIRS = src . test include
lib_LTLIBRARIES = libspatialindex.la libspatialindex_c.la
......@@ -20,4 +20,18 @@ libspatialindex_c_la_LIBADD = \
libspatialindex_la_LDFLAGS = -version-info 1:0:0
libspatialindex_c_la_LDFLAGS = -version-info 1:0:0 -lstdc++
EXTRA_DIST = makefile.vc INSTALL.WIN
EXTRA_DIST = makefile.vc \
INSTALL.WIN \
spatialindex.sln \
spatialindex-vc/spatialindex.vcproj \
CMakeLists.txt \
src/CMakeLists.txt \
test/CMakeLists.txt \
test/mvrtree/test1/run \
test/mvrtree/test2/run \
test/rtree/test1/run \
test/rtree/test2/run \
test/rtree/test3/run \
test/rtree/test4/run \
test/tprtree/test1/run \
test/tprtree/test2/run
This diff is collapsed.
......@@ -4,8 +4,8 @@
:Author: Marios Hadjieleftheriou
:Contact: mhadji@gmail.com
:Revision: $Revision: 65 $
:Date: $Date: 2008-01-21 08:19:44 -0600 (Mon, 21 Jan 2008) $
:Revision: $Revision$
:Date: $Date$
.. The next heading encountered becomes our H2
..
......@@ -41,6 +41,7 @@ The purpose of this library is to provide:
Installation
------------------------------------------------------------------------------
First run autogen.sh to generate the configure scripts.
By default include files and library files will be installed in /usr/local. If
you would like to use a different installation directory (e.g., in case
that you do not have root access) run the configure script with
......@@ -73,7 +74,7 @@ files and then compile with the following options:
If the library is installed in the default /usr/local path, then the
-I and -L options are not necessary.
If you are compiling on Mac OS X you will might need to add the -bind_at_load
If you are compiling on Mac OS X you will need to add the -bind_at_load
option when linking against the dynamic link libraries. OS X Tiger should
work out of the box, however, with XCode 3.0.
......@@ -370,6 +371,39 @@ RegionPoolCapacity VT_LONG Default is 1000
PointPoolCapacity VT_LONG Default is 500
========================== =========== ============================================================
Performance
------------------------------------------------------------------------------
Dataset size, data density, etc. have nothing to do with capacity and page
size. What you are trying to achieve is fast reads from the disk and take
advantage of disk buffering and prefetching.
Normally, you select the page size to be equal to the disk page size (depends
on how you format the drive). Then you choose the node capacity to be enough
to fill the whole page (including data entries if you have any).
There is a tradeoff though in making node capacity too large. The larger the
capacity, the longer the "for loops" for inserting, deleting, locating node
entries take (CPU time). On the other hand, the larger the capacity the
shorter the tree becomes, reducing the number of random IOs to reach the
leaves. Hence, you might want to fit multiple nodes (of smaller capacity)
inside a single page to balance I/O and CPU cost, in case your disk page size
is too large.
Finally, if you have enough buffer space to fit most of the index nodes in
main memory, then large capacities do not make too much sense, because the
height of the tree does not matter any more. Of course, the smaller the
capacity, the larger the number of leaf nodes you will have to retrieve from
disk for range queries (point queries and nearest neighbor queries will not
suffer that much). So very small capacities hurt as well.
There is another issue when trying to fit multiple nodes per page: Leftover
space. You might have leftover space due to data entries that do not have a
fixed size. Unfortunately, in that case, leftover space per page is lost,
negatively impacting space usage.
Selecting the right page size is easy; make it equal to the disk page size.
Selecting the right node capacity is an art...
------------------------------------------------------------------------------
Contact Information
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -4,7 +4,7 @@
AC_PREREQ(2.59)
m4_define([sidx_version_major], [1])
m4_define([sidx_version_minor], [5])
m4_define([sidx_version_minor], [7])
m4_define([sidx_version_micro], [0])
m4_define([sidx_version],
[sidx_version_major.sidx_version_minor.sidx_version_micro])
......@@ -13,7 +13,9 @@ AC_INIT([spatialindex], [sidx_version], [mhadji@gmail.com], [spatialindex-src])
AC_CANONICAL_BUILD
debug_default="no"
CXXFLAGS="$CXXFLAGS"
CFLAGS="-Wall -Wno-long-long -pedantic $CFLAGS"
CXXFLAGS="-Wall -Wno-long-long -pedantic -std=c++98 $CXXFLAGS"
# Checks for programs.
AC_PROG_CXX
......@@ -33,6 +35,8 @@ AC_CHECK_HEADERS(pthread.h, [LIBS="$LIBS -lpthread"])
AC_CHECK_HEADERS(sys/resource.h,, [AC_MSG_ERROR([cannot find sys/resource.h, bailing out])])
AC_CHECK_HEADERS(sys/time.h,, [AC_MSG_ERROR([cannot find sys/time.h, bailing out])])
AC_CHECK_HEADERS(stdint.h,, [AC_MSG_ERROR([cannot find stdint.h, bailing out])])
AC_CHECK_HEADERS(features.h)
#MH_CXX_HEADER_TOOLS
LIBS="$LIBS"
......@@ -48,13 +52,14 @@ else
fi
# Checks for library functions.
AC_CHECK_FUNCS([gettimeofday bzero memset memcpy bcopy])
AC_CHECK_FUNCS([gettimeofday bzero memset memcpy bcopy srand48])
AM_CONDITIONAL([RAND_IS_CONFIG], [test "x$HAVE_SRAND48" = xtrue])
AC_CONFIG_FILES([ Makefile
include/Makefile
include/capi/Makefile
include/tools/Makefile
src/Makefile
src/libspatialindex.pc
src/capi/Makefile
src/spatialindex/Makefile
src/storagemanager/Makefile
......@@ -62,10 +67,10 @@ AC_CONFIG_FILES([ Makefile
src/mvrtree/Makefile
src/tprtree/Makefile
src/tools/Makefile
regressiontest/Makefile
regressiontest/rtree/Makefile
regressiontest/mvrtree/Makefile
regressiontest/tprtree/Makefile])
test/Makefile
test/rtree/Makefile
test/mvrtree/Makefile
test/tprtree/Makefile])
AC_OUTPUT
SUBDIRS = tools capi
spatialindexdir = $(includedir)
spatialindexdir = $(includedir)/spatialindex
spatialindex_HEADERS = SpatialIndex.h \
RTree.h \
MVRTree.h \
TPRTree.h \
Point.h \
Region.h \
LineSegment.h \
TimePoint.h \
TimeRegion.h \
MovingPoint.h \
MovingRegion.h \
Version.h
\ No newline at end of file
nobase_spatialindex_HEADERS = spatialindex/SpatialIndex.h \
spatialindex/RTree.h \
spatialindex/MVRTree.h \
spatialindex/TPRTree.h \
spatialindex/Point.h \
spatialindex/Region.h \
spatialindex/LineSegment.h \
spatialindex/TimePoint.h \
spatialindex/TimeRegion.h \
spatialindex/MovingPoint.h \
spatialindex/MovingRegion.h \
spatialindex/Version.h \
spatialindex/capi/BoundsQuery.h \
spatialindex/capi/CountVisitor.h \
spatialindex/capi/CustomStorage.h \
spatialindex/capi/DataStream.h \
spatialindex/capi/Error.h \
spatialindex/capi/IdVisitor.h \
spatialindex/capi/Index.h \
spatialindex/capi/LeafQuery.h \
spatialindex/capi/ObjVisitor.h \
spatialindex/capi/sidx_api.h \
spatialindex/capi/sidx_config.h \
spatialindex/capi/sidx_impl.h \
spatialindex/capi/Utility.h \
spatialindex/tools/PointerPool.h \
spatialindex/tools/PoolPointer.h \
spatialindex/tools/rand48.h \
spatialindex/tools/SmartPointer.h \
spatialindex/tools/Tools.h
\ No newline at end of file
This diff is collapsed.
spatialindexdir = $(includedir)/spatialindex/capi
dist_spatialindex_HEADERS = \
BoundsQuery.h \
CountVisitor.h \
DataStream.h \
Error.h \
IdVisitor.h \
Index.h \
LeafQuery.h \
ObjVisitor.h \
sidx_api.h \
sidx_config.h \
sidx_impl.h \
Utility.h
This diff is collapsed.
......@@ -151,5 +151,6 @@ namespace SpatialIndex
friend SIDX_DLL std::ostream& operator<<(std::ostream& os, const MovingRegion& r);
}; // MovingRegion
typedef Tools::PoolPointer<MovingRegion> MovingRegionPtr;
SIDX_DLL std::ostream& operator<<(std::ostream& os, const MovingRegion& r);
}
......@@ -21,6 +21,8 @@
#pragma once
#include <spatialindex/tools/Tools.h>
namespace SpatialIndex
{
class SIDX_DLL Point : public Tools::IObject, public virtual IShape
......@@ -72,6 +74,8 @@ namespace SpatialIndex
friend class Region;
friend SIDX_DLL std::ostream& operator<<(std::ostream& os, const Point& pt);
}; // Point
typedef Tools::PoolPointer<Point> PointPtr;
SIDX_DLL std::ostream& operator<<(std::ostream& os, const Point& pt);
}
......@@ -92,6 +92,7 @@ namespace SpatialIndex
friend SIDX_DLL std::ostream& operator<<(std::ostream& os, const Region& r);
}; // Region
typedef Tools::PoolPointer<Region> RegionPtr;
SIDX_DLL std::ostream& operator<<(std::ostream& os, const Region& r);
}
......@@ -31,11 +31,14 @@
#define M_PI_2 1.57079632679489661922
#endif
namespace SpatialIndex
{
class Point;
class Region;
typedef int64_t id_type;
SIDX_DLL enum CommandType
......@@ -248,3 +251,9 @@ namespace SpatialIndex
#include "MVRTree.h"
#include "TPRTree.h"
#include "Version.h"
// typedef SpatialIndex::Tools::PoolPointer<Region> RegionPtr;
// typedef SpatialIndex::Tools::PoolPointer<Point> PointPtr;
// typedef SpatialIndex::Tools::PoolPointer<TimeRegion> TimeRegionPtr;
// typedef SpatialIndex::Tools::PoolPointer<MovingRegion> MovingRegionPtr;
......@@ -98,5 +98,6 @@ namespace SpatialIndex
friend SIDX_DLL std::ostream& operator<<(std::ostream& os, const TimeRegion& r);
}; // TimeRegion
typedef Tools::PoolPointer<TimeRegion> TimeRegionPtr;
SIDX_DLL std::ostream& operator<<(std::ostream& os, const TimeRegion& r);
}
......@@ -23,7 +23,7 @@
#ifndef SIDX_VERSION_MAJOR
#define SIDX_VERSION_MAJOR 1
#define SIDX_VERSION_MINOR 5
#define SIDX_VERSION_MINOR 7
#define SIDX_VERSION_REV 0
#define SIDX_VERSION_BUILD 0
#endif
......@@ -33,10 +33,10 @@
#endif
#ifndef SIDX_RELEASE_DATE
#define SIDX_RELEASE_DATE 20100305
#define SIDX_RELEASE_DATE 20111014
#endif
#ifndef SIDX_RELEASE_NAME
#define SIDX_RELEASE_NAME "1.5.0"
#define SIDX_RELEASE_NAME "1.7.0"
#endif
/******************************************************************************
* $Id: CustomStorage.h 1385 2009-06-17 13:45:16Z nitro $
*
* Project: libsidx - A C API wrapper around libspatialindex
* Purpose: C++ object declarations to implement the custom storage manager.
* Author: Matthias (nitro)
*
******************************************************************************
* Copyright (c) 2010, Matthias (nitro)
*
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
****************************************************************************/
#pragma once
namespace SpatialIndex
{
namespace StorageManager
{
struct CustomStorageManagerCallbacks
{
CustomStorageManagerCallbacks() : context(0), createCallback(0), destroyCallback(0), loadByteArrayCallback(0), storeByteArrayCallback(0), deleteByteArrayCallback(0)
{}
void* context;
void (*createCallback)( const void* context, int* errorCode );
void (*destroyCallback)( const void* context, int* errorCode );
void (*loadByteArrayCallback)( const void* context, const id_type page, uint32_t* len, byte** data, int* errorCode );
void (*storeByteArrayCallback)( const void* context, id_type* page, const uint32_t len, const byte* const data, int* errorCode );
void (*deleteByteArrayCallback)( const void* context, const id_type page, int* errorCode );
};
class CustomStorageManager : public SpatialIndex::IStorageManager
{
public:
// I'd like this to be an enum, but casting between enums and ints is not nice
static const int NoError = 0;
static const int InvalidPageError = 1;
static const int IllegalStateError = 2;
CustomStorageManager(Tools::PropertySet&);
virtual ~CustomStorageManager();
virtual void loadByteArray(const id_type page, uint32_t& len, byte** data);
virtual void storeByteArray(id_type& page, const uint32_t len, const byte* const data);
virtual void deleteByteArray(const id_type page);
private:
CustomStorageManagerCallbacks callbacks;
inline void processErrorCode(int errorCode, const id_type page);
}; // CustomStorageManager
// factory function
IStorageManager* returnCustomStorageManager(Tools::PropertySet& in);
}
}
......@@ -39,9 +39,9 @@ public:
/// Assignment operator.
Error& operator=(Error const& rhs);
int GetCode() const { return m_code; };
const char* GetMessage() const { return m_message.c_str(); };
const char* GetMethod() const { return m_method.c_str(); };
int GetCode() const { return m_code; }
const char* GetMessage() const { return m_message.c_str(); }
const char* GetMethod() const { return m_method.c_str(); }
private:
......
......@@ -49,6 +49,8 @@ public:
void SetIndexVariant(RTStorageType v);
SpatialIndex::ISpatialIndex& index() {return *m_rtree;}
SpatialIndex::StorageManager::IBuffer& buffer() {return *m_buffer;}
private:
void Initialize();
......
......@@ -52,8 +52,8 @@ private:
uint32_t m_id;
LeafQueryResult();
public:
LeafQueryResult(uint32_t id) : bounds(0), m_id(id){};
~LeafQueryResult() {if (bounds!=0) delete bounds;};
LeafQueryResult(uint32_t id) : bounds(0), m_id(id){}
~LeafQueryResult() {if (bounds!=0) delete bounds;}
/// Copy constructor.
LeafQueryResult(LeafQueryResult const& other);
......
......@@ -38,20 +38,20 @@ IDX_C_START
SIDX_DLL IndexH Index_Create(IndexPropertyH properties);
SIDX_DLL IndexH Index_CreateWithStream( IndexPropertyH properties,
int (*readNext)(uint64_t *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength)
int (*readNext)(int64_t *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength)
);
SIDX_DLL void Index_Destroy(IndexH index);