📄 gistentry.h
字号:
// -*- Mode: C++ -*-
// GiSTentry.h
//
// Copyright (c) 1996, Regents of the University of California
#ifndef GISTENTRY_H
#define GISTENTRY_H
#include <string.h> // for memcpy
#include "GiSTdefs.h"
#include "GiSTpredicate.h"
class GiSTnode;
// GiSTcompressedEntry is the compressed format of a key-pointer pair.
class GiSTcompressedEntry {
public:
char *key;
int keyLen;
GiSTpage ptr;
GiSTcompressedEntry() : key(NULL), keyLen(0), ptr(0) {}
const GiSTcompressedEntry operator = (const GiSTcompressedEntry c) {
key = c.key;
keyLen = c.keyLen;
ptr = c.ptr;
return(*this);
}
};
// GiSTpenalty is the token returned by the Penalty method. We don't
// just use doubles here because it can be useful to use more
// complex Penalty comparisons (e.g. to support multivalued Penalties that
// break ties in a single value).
class GiSTpenalty {
public:
GiSTpenalty() : amount(0) {}
GiSTpenalty(const double d): amount(d) {}
virtual double operator = (const double d) {
amount = d;
return amount;
}
virtual int operator < (const GiSTpenalty &p) const {
if (amount < p.amount)
return(1);
else
return(0);
}
virtual ~GiSTpenalty() {}
protected:
double amount;
};
// GiSTentry: a key/pointer pair inside a node.
// The key is a pointer to a GiSTobject, which can be used to
// point to just about anything you like.
class GiSTentry : public GiSTobject {
public:
GiSTentry() : node(NULL), level(0) {}
GiSTentry(GiSTpage ptr) : node(NULL), ptr(ptr) {}
GiSTentry(const GiSTentry& e) : node(e.node), ptr(e.ptr),
position(e.position), level(e.level) {}
virtual ~GiSTentry() {
if (key)
delete key;
}
// The following methods must be overridden by descendant classes
virtual GiSTpenalty *Penalty(const GiSTentry &key) const = 0;
virtual int CompressedLength() const = 0; // length of compressed key
#ifdef PRINTING_OBJECTS
virtual void Print(ostream& os) const = 0;
#endif
virtual GiSTobject *Copy() const = 0;
// Default compression is just to copy the key (i.e. no compression).
// Since the copy method is virtual, the appropriate Copy method is called.
// Besides compressing the key, Compress also sets the pointer.
virtual GiSTcompressedEntry Compress() const {
GiSTcompressedEntry compressedEntry;
compressedEntry.key = (char *)key->Copy();
compressedEntry.keyLen = CompressedLength();
compressedEntry.ptr = ptr;
return compressedEntry;
}
// Besides decompressing the key, Decompress also sets the pointer.
virtual void Decompress(const GiSTcompressedEntry entry) {
key = (GiSTobject *)new char[entry.keyLen];
memcpy(key, entry.key, entry.keyLen);
ptr = entry.ptr;
}
// If you have ordered keys, this can be overridden a la qsort's compare
virtual int Compare(const GiSTentry& entry) const { return 0; }
// access to the protected info
GiSTpage Ptr() const { return ptr; }
void SetPtr(GiSTpage p) { ptr = p; }
GiSTobject *Key() const { return key; }
GiSTobjid IsA() const { return GISTENTRY_CLASS; }
int IsLeaf() const { return level == 0; }
int Level() const { return level; }
void SetLevel(int l) { level = l; }
void SetPosition(int pos) { position = pos; }
int Position() const { return position; }
GiSTnode *Node() const { return node; }
void SetNode(GiSTnode *n) { node = n; }
protected:
GiSTnode *node;
GiSTpage ptr;
int position;
int level;
GiSTobject *key;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -