ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/GiST/GiSTentry.h
Revision: 1.1
Committed: Sun May 6 00:45:51 2001 UTC (23 years ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
*** empty log message ***

File Contents

# Content
1 // -*- Mode: C++ -*-
2
3 // GiSTentry.h
4 //
5 // Copyright (c) 1996, Regents of the University of California
6
7
8 #ifndef GISTENTRY_H
9 #define GISTENTRY_H
10
11 #include <string.h> // for memcpy
12 #include "GiSTdefs.h"
13 #include "GiSTpredicate.h"
14
15 class GiSTnode;
16
17 // GiSTcompressedEntry is the compressed format of a key-pointer pair.
18 class GiSTcompressedEntry {
19 public:
20 char *key;
21 int keyLen;
22 GiSTpage ptr;
23
24 GiSTcompressedEntry(): key(NULL), keyLen(0), ptr(0) {}
25 const GiSTcompressedEntry operator = (const GiSTcompressedEntry c) {
26 key=c.key;
27 keyLen=c.keyLen;
28 ptr=c.ptr;
29 return(*this);
30 }
31 };
32
33 // GiSTpenalty is the token returned by the Penalty method. We don't
34 // just use doubles here because it can be useful to use more
35 // complex Penalty comparisons (e.g. to support multivalued Penalties that
36 // break ties in a single value).
37 class GiSTpenalty {
38 public:
39 GiSTpenalty(): amount(0) {}
40 GiSTpenalty(const double d): amount(d) {}
41 virtual double operator = (const double d) {
42 amount=d;
43 return amount;
44 }
45 virtual int operator < (const GiSTpenalty &p) const {
46 if(amount<p.amount) return(1);
47 else return(0);
48 }
49
50 virtual ~GiSTpenalty() {}
51
52 protected:
53 double amount;
54 };
55
56 // GiSTentry: a key/pointer pair inside a node.
57 // The key is a pointer to a GiSTobject, which can be used to
58 // point to just about anything you like.
59 class GiSTentry : public GiSTobject {
60 public:
61 GiSTentry(): node(NULL), level(0) {}
62 GiSTentry(GiSTpage ptr): node(NULL), ptr(ptr) {}
63 GiSTentry(const GiSTentry& e): node(e.node), ptr(e.ptr),
64 position(e.position), level(e.level) {}
65
66 virtual ~GiSTentry() { if(key) delete key; }
67
68 // The following methods must be overridden by descendant classes
69 virtual GiSTpenalty *Penalty(const GiSTentry &key) const=0;
70 virtual int CompressedLength() const=0; // length of compressed key
71 #ifdef PRINTING_OBJECTS
72 virtual void Print(ostream& os) const=0;
73 #endif
74 virtual GiSTobject *Copy() const=0;
75 // Default compression is just to copy the key (i.e. no compression).
76 // Since the copy method is virtual, the appropriate Copy method is called.
77 // Besides compressing the key, Compress also sets the pointer.
78 virtual GiSTcompressedEntry Compress() const {
79 GiSTcompressedEntry compressedEntry;
80
81 compressedEntry.key=(char *)key->Copy();
82 compressedEntry.keyLen=CompressedLength();
83 compressedEntry.ptr=ptr;
84 return compressedEntry;
85 }
86 // Besides decompressing the key, Decompress also sets the pointer.
87 virtual void Decompress(const GiSTcompressedEntry entry) {
88 key=(GiSTobject *)new char[entry.keyLen];
89 memcpy(key, entry.key, entry.keyLen);
90 ptr=entry.ptr;
91 }
92
93 // If you have ordered keys, this can be overridden a la qsort's compare
94 virtual int Compare(const GiSTentry& entry) const { return 0; }
95
96 // access to the protected info
97 GiSTpage Ptr() const { return ptr; }
98 void SetPtr(GiSTpage p) { ptr=p; }
99 GiSTobject *Key() const { return key; }
100
101 GiSTobjid IsA() const { return GISTENTRY_CLASS; }
102 int IsLeaf() const { return level==0; }
103 int Level() const { return level; }
104 void SetLevel(int l) { level=l; }
105
106 void SetPosition(int pos) { position=pos; }
107 int Position() const { return position; }
108
109 GiSTnode *Node() const { return node; }
110 void SetNode(GiSTnode *n) { node=n; }
111
112 protected:
113 GiSTnode *node;
114 GiSTpage ptr;
115 int position;
116 int level;
117 GiSTobject *key;
118 };
119
120 #endif