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