1//----------------------------------------------------------------------
2//  This software is part of the OpenBeOS distribution and is covered
3//  by the OpenBeOS license.
4//
5//  Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
6//---------------------------------------------------------------------
7
8#ifndef _UDF_ARRAY_H
9#define _UDF_ARRAY_H
10
11#include "kernel_cpp.h"
12
13#include "SupportDefs.h"
14#include "UdfDebug.h"
15
16namespace Udf {
17
18/*! \brief Slightly more typesafe static array type than built-in arrays,
19	with array length information stored implicitly (i.e. consuming no
20	physical space in the actual struct) via the \c arrayLength template
21	parameter.
22*/
23template<typename DataType, uint32 arrayLength>
24struct array {
25public:
26	void dump() const {
27		for (uint32 i = 0; i < arrayLength; i++)
28			data[i].print();
29	}
30
31	uint32 length() const { return arrayLength; }
32	uint32 size() const { return arrayLength * sizeof(DataType); }
33
34	// This doesn't appear to work. I don't know why.
35	DataType operator[] (int index) const { return data[index]; }
36
37	DataType data[arrayLength];
38};
39
40/*! \brief \c uint8 specialization of the \c array template struct.
41*/
42template<uint32 arrayLength>
43struct array<uint8, arrayLength> {
44	void dump() const
45	{
46		const uint8 bytesPerRow = 8;
47		char classname[40];
48		sprintf(classname, "array<uint8, %ld>", arrayLength);
49
50		DUMP_INIT(classname);
51
52		for (uint32 i = 0; i < arrayLength; i++) {
53			if (i % bytesPerRow == 0)
54				PRINT(("[%ld:%ld]: ", i, i+bytesPerRow-1));
55			SIMPLE_PRINT(("0x%.2x ", data[i]));
56			if ((i+1) % bytesPerRow == 0 || i+1 == arrayLength)
57				SIMPLE_PRINT(("\n"));
58		}
59	}
60	uint32 length() const { return arrayLength; }
61	uint32 size() const { return arrayLength; }
62	uint8 data[arrayLength];
63};
64
65/*! \brief \c char specialization of the \c array template struct.
66*/
67template<uint32 arrayLength>
68struct array<char, arrayLength> {
69	void dump() const
70	{
71		const uint8 bytesPerRow = 8;
72		char classname[40];
73		sprintf(classname, "array<uint8, %ld>", arrayLength);
74
75		DUMP_INIT(classname);
76
77		for (uint32 i = 0; i < arrayLength; i++) {
78			if (i % bytesPerRow == 0)
79				PRINT(("[%ld:%ld]: ", i, i+bytesPerRow-1));
80			SIMPLE_PRINT(("0x%.2x ", data[i]));
81			if ((i+1) % bytesPerRow == 0 || i+1 == arrayLength)
82				SIMPLE_PRINT(("\n"));
83		}
84	}
85	uint32 length() const { return arrayLength; }
86	uint32 size() const { return arrayLength; }
87	uint8 data[arrayLength];
88};
89
90
91};	// namespace UDF
92
93#endif	// _UDF_ARRAY_H
94