xref: /haiku/src/add-ons/kernel/file_systems/reiserfs/Block.h (revision f0bc043b2a91affc1db09f77313f94f96013ff36)
1 // Block.h
2 //
3 // Copyright (c) 2003, Ingo Weinhold (bonefish@cs.tu-berlin.de)
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 //
19 // You can alternatively use *this file* under the terms of the the MIT
20 // license included in this package.
21 
22 #ifndef BLOCK_H
23 #define BLOCK_H
24 
25 #include <SupportDefs.h>
26 
27 #include "BlockCache.h"
28 #include "endianess.h"
29 #include "reiserfs.h"
30 
31 class DiskChild;
32 class InternalNode;
33 class Item;
34 class ItemHeader;
35 class Key;
36 class VKey;
37 class LeafNode;
38 class Node;
39 
40 // Block
41 class Block {
42 public:
43 	Block();
44 	~Block();
45 
46 	BlockCache *GetCache() const;
47 	uint32 GetBlockSize() const;
48 
49 	void Get();
50 	void Put();
51 
52 	uint64 GetNumber() const;
53 	void *GetData() const;
54 
55 	void SetKind(uint32 kind);
GetKind()56 	uint32 GetKind() const			{ return (fFlags & KIND_MASK); }
57 
58 	void SetChecked(bool checked);
IsChecked()59 	bool IsChecked() const			{ return (fFlags & CHECKED); }
60 
61 	bool IsFormatted() const;
62 	bool IsLeaf() const;
63 	bool IsInternal() const;
64 
65 	Node *ToNode();
66 	InternalNode *ToInternalNode();
67 	LeafNode *ToLeafNode();
68 
69 public:
70 	enum {
71 		KIND_FORMATTED		= 0x00,
72 		KIND_UNFORMATTED	= 0x01,
73 		KIND_UNKNOWN		= 0x02,
74 		KIND_MASK			= 0x03,
75 		CHECKED				= 0x80,
76 	};
77 
78 private:
79 	status_t _SetTo(BlockCache *cache, uint64 number);
80 	void _Unset();
81 
_GetRefCount()82 	int32 _GetRefCount() const { return fRefCount; }
83 	void _Get();
84 	bool _Put();
85 
86 private:
87 	friend class BlockCache;
88 
89 protected:
90 	BlockCache		*fCache;
91 	uint64			fNumber;
92 	void			*fData;
93 	uint32			fFlags;
94 	int32			fRefCount;
95 };
96 
97 // Node
98 class Node : public Block {
99 public:
100 	uint16 GetLevel() const;
101 	uint16 CountItems() const;
102 	uint16 GetFreeSpace() const;
103 	bool IsLeaf() const;
104 	bool IsInternal() const;
105 
106 	status_t Check() const;
107 
108 private:
109 	block_head *GetHeader() const;
110 
111 private:
112 	Node();
113 };
114 
115 // InternalNode
116 class InternalNode : public Node {
117 public:
118 	const Key *GetKeys() const;
119 	const Key *KeyAt(int32 index) const;
120 	const DiskChild *GetChilds() const;
121 	const DiskChild *ChildAt(int32 index) const;
122 
123 	status_t Check() const;
124 };
125 
126 // LeafNode
127 class LeafNode : public Node {
128 public:
129 	const ItemHeader *GetItemHeaders() const;
130 	const ItemHeader *ItemHeaderAt(int32 index) const;
131 	status_t GetLeftKey(VKey *k) const;
132 	status_t GetRightKey(VKey *k) const;
133 
134 	status_t Check() const;
135 
136 	uint32 GetItemSpaceOffset() const;
137 };
138 
139 // DiskChild
140 class DiskChild : private disk_child {
141 public:
DiskChild()142 	DiskChild() {}
143 
GetBlockNumber()144 	uint32 GetBlockNumber() const { return le2h(dc_block_number); }
GetSize()145 	uint16 GetSize() const { return le2h(dc_size); }
146 };
147 
148 #endif	// BLOCK_H
149