summaryrefslogtreecommitdiffstats
path: root/src/H5Bprivate.h
blob: f7c3e50c253b0c6dcfd950528a8ae0a4ec19496d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*-------------------------------------------------------------------------
 * Copyright (C) 1997	National Center for Supercomputing Applications.
 *                      All rights reserved.
 *
 *-------------------------------------------------------------------------
 *
 * Created:		H5Bprivate.h
 * 			Jul 10 1997
 * 			Robb Matzke <matzke@llnl.gov>
 *
 * Purpose:		Private non-prototype header.
 *
 * Modifications:	
 *
 *-------------------------------------------------------------------------
 */
#ifndef _H5Bprivate_H
#define _H5Bprivate_H
#include <H5Bpublic.h>		/*API prototypes			*/

/* Private headers needed by this file */
#include <H5private.h>
#include <H5Fprivate.h>

#define H5B_MAGIC	"TREE"	/*tree node magic number		*/
#define H5B_SIZEOF_MAGIC 4	/*size of magic number			*/

#define H5B_SIZEOF_HDR(F)						      \
   (H5B_SIZEOF_MAGIC +		/*magic number				*/    \
    4 +				/*type, level, num entries		*/    \
    2*H5F_SIZEOF_OFFSET(F))	/*left and right sibling addresses	*/

#define H5B_K(F,TYPE)		/*K value given file and Btree subclass	*/    \
   ((F)->file_create_parms.btree_k[(TYPE)->id])

#define H5B_ANCHOR_LT	0	/* left node is anchored, right is new	*/
#define H5B_ANCHOR_RT	1	/* right node is anchored, left is new	*/

typedef enum H5B_subid_t {
   H5B_SNODE_ID		=0	/*B-tree is for symbol table nodes	*/
} H5B_subid_t;
   

/*
 * Each class of object that can be pointed to by a B-link tree has a
 * variable of this type that contains class variables and methods.  Each
 * tree has a K (1/2 rank) value on a per-file basis.  The file_create_parms
 * has an array of K values indexed by the `id' class field below.  The
 * array is initialized with the HDF5_BTREE_K_DEFAULT macro.
 */
typedef struct H5B_class_t {
   H5B_subid_t	id;		/*id as found in file			*/
   size_t	sizeof_nkey;	/*size of native (memory) key		*/
   size_t	(*get_sizeof_rkey)(hdf5_file_t*);
   haddr_t	(*new)(hdf5_file_t*,void*,void*,void*);
   intn		(*cmp)(hdf5_file_t*,void*,void*,void*);
   herr_t	(*found)(hdf5_file_t*,haddr_t,const void*,void*,const void*);
   haddr_t	(*insert)(hdf5_file_t*,haddr_t,int*,void*,hbool_t*,void*,void*,
			  void*,hbool_t*);
   herr_t	(*list)(hdf5_file_t*,haddr_t,void*);
   herr_t	(*decode)(hdf5_file_t*,uint8*,void*);
   herr_t	(*encode)(hdf5_file_t*,uint8*,void*);
} H5B_class_t;

/*
 * The B-tree node as stored in memory...
 */
typedef struct H5B_key_t {
   hbool_t	dirty;		/*native key is more recent than raw key*/
   uint8	*rkey;		/*ptr into node->page for raw key	*/
   void		*nkey;		/*null or ptr into node->native for key	*/
} H5B_key_t;

typedef struct H5B_t {
   const H5B_class_t *type;	/*type of tree				*/
   size_t	sizeof_rkey;	/*size of raw (disk) key		*/
   hbool_t	dirty;		/*something in the tree is dirty	*/
   intn		ndirty;		/*num child ptrs to emit		*/
   intn		level;		/*node level				*/
   haddr_t	left;		/*address of left sibling		*/
   haddr_t	right;		/*address of right sibling		*/
   intn		nchildren;	/*number of child pointers		*/
   uint8	*page;		/*disk page				*/
   uint8	*native;	/*array of keys in native format	*/
   H5B_key_t	*key;		/*2k+1 key entries			*/
   haddr_t	*child;		/*2k child pointers			*/
} H5B_t;


/*
 * Library prototypes.
 */
herr_t H5B_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
		  intn fwidth, H5B_class_t *type);
haddr_t H5B_new (hdf5_file_t *f, const H5B_class_t *type);
herr_t H5B_find (hdf5_file_t *f, H5B_class_t *type, haddr_t addr,
		 void *udata);
haddr_t H5B_insert (hdf5_file_t *f, H5B_class_t *type, haddr_t addr,
		    void *udata);
herr_t H5B_list (hdf5_file_t *f, H5B_class_t *type, haddr_t addr,
		 void *udata);


#endif