📄 hnsrtree.cc
字号:
/* * HnSRTree.cc * Copyright (C) 1997 Norio Katayama * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA * * 10/14/96 katayama@rd.nacsis.ac.jp * $Id: HnSRTree.cc,v 1.4 1997/06/02 09:35:35 katayama Exp $ */#include <stdlib.h>#include "HnSRTree.h"#include "HnSRTreeFile.hh"static HnSRTreeRecord *allocateRecords(int dimension, int dataSize, int count);static void freeRecords(HnSRTreeRecord *records, int count);static void setRecord(HnSRTreeRecord *record, const HnPoint &point, const HnData &data);HnSRTree *HnSRTreeCreate(const char *path, int dimension, int dataSize, int blockSize, int splitFactor, int reinsertFactor){ HnSRTreeFile *file; file = new HnSRTreeFile(); *file = new_HnSRTreeFile(path, dimension, dataSize, blockSize, splitFactor, reinsertFactor); if(*file == HnSRTreeFile::null) { delete file; return NULL; } return (void *)file;}HnSRTree *HnSRTreeUpdate(const char *path){ HnSRTreeFile *file; file = new HnSRTreeFile(); *file = new_HnSRTreeFile(path, "rw"); if(*file == HnSRTreeFile::null) { delete file; return NULL; } return (void *)file;}HnSRTree *HnSRTreeOpen(const char *path){ HnSRTreeFile *file; file = new HnSRTreeFile(); *file = new_HnSRTreeFile(path, "r"); if(*file == HnSRTreeFile::null) { delete file; return NULL; } return (void *)file;}voidHnSRTreeClose(HnSRTree *srtree){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; file->close(); delete file;}voidHnSRTreeStore(HnSRTree *srtree, const double coords[], const void *data, int size){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; int dimension = file->getDimension(); HnPoint point; HnData value; int i; point = new_HnPoint(dimension); for(i=0; i<dimension; i++) point.setCoord(coords[i], i); value = new_HnData(data, size); file->store(point, value);}voidHnSRTreeRemove(HnSRTree *srtree, const double coords[], const void *data, int size){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; int dimension = file->getDimension(); HnPoint point; HnData value; int i; point = new_HnPoint(dimension); for(i=0; i<dimension; i++) point.setCoord(coords[i], i); value = new_HnData(data, size); file->remove(point, value);}voidHnSRTreeGetFirst(HnSRTree *srtree, const HnSRTreeRange ranges[], HnSRTreeRecord **record_return){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; int dimension = file->getDimension(); int dataSize = file->getDataSize(); HnPoint point; HnData data; static HnSRTreeRecord *records = NULL; if(ranges == NULL) file->getFirst(&point, &data); else { HnRect rect = new_HnRect(dimension); int i; for(i=0; i<dimension; i++) { rect.setRange(ranges[i].min, HnRange::INCLUSIVE, ranges[i].max, HnRange::INCLUSIVE, i); } file->getFirst(rect, &point, &data); } if(point == HnPoint::null) *record_return = NULL; else { if(records != NULL) freeRecords(records, 1); records = allocateRecords(dimension, dataSize, 1); setRecord(&records[0], point, data); *record_return = &records[0]; }}voidHnSRTreeGetNext(HnSRTree *srtree, HnSRTreeRecord **record_return){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; int dimension = file->getDimension(); int dataSize = file->getDataSize(); HnPoint point; HnData data; static HnSRTreeRecord *records = NULL; file->getNext(&point, &data); if(point == HnPoint::null) *record_return = NULL; else { if(records != NULL) freeRecords(records, 1); records = allocateRecords(dimension, dataSize, 1); setRecord(&records[0], point, data); *record_return = &records[0]; }}voidHnSRTreeGetNeighbors(HnSRTree *srtree, const double coords[], int maxCount, HnSRTreeRecord **records_return, int *numRecords_return){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; int dimension = file->getDimension(); int dataSize = file->getDataSize(); HnPoint target; HnPointArray points; HnDataArray values; int i; static HnSRTreeRecord *records = NULL; static int numRecords = -1; target = new_HnPoint(dimension); for(i=0; i<dimension; i++) target.setCoord(coords[i], i); file->getNeighbors(target, maxCount, &points, &values); if(records != NULL) freeRecords(records, numRecords); numRecords = points.length(); records = allocateRecords(dimension, dataSize, numRecords); for(i=0; i<numRecords; i++) setRecord(&records[i], points[i], values[i]); *records_return = records; *numRecords_return = numRecords;}intHnSRTreeGetDimension(HnSRTree *srtree){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; return file->getDimension();}voidHnSRTreeCheck(HnSRTree *srtree){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; file->check();}voidHnSRTreePrint(HnSRTree *srtree){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; file->print();}voidHnSRTreeSetDebug(HnSRTree *srtree, int debug){ HnSRTreeFile *file = (HnSRTreeFile *)srtree; file->setDebug(debug);}static HnSRTreeRecord *allocateRecords(int dimension, int dataSize, int count){ HnSRTreeRecord *records; int i; if((records = (HnSRTreeRecord *) malloc(sizeof(HnSRTreeRecord) * count)) == NULL) HnSysError("malloc"); for(i=0; i<count; i++) { char *ptr; if((ptr = (char *) malloc(sizeof(double) * dimension + dataSize)) == NULL) HnSysError("malloc"); records[i].coords = (double *)ptr; records[i].data = ptr + sizeof(double) * dimension; } return records;}static voidfreeRecords(HnSRTreeRecord *records, int count){ int i; for(i=0; i<count; i++) free(records[i].coords); free(records);}static voidsetRecord(HnSRTreeRecord *record, const HnPoint &point, const HnData &data){ int i; for(i=0; i<point.getDimension(); i++) record->coords[i] = point.getCoord(i); memcpy(record->data, data.chars(), data.length()); record->size = data.length();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -