Initial checkin.

Slightly more typesafe static array type than built-in arrays,
with array length information stored implicitly (i.e. consuming no
physical space in the actual struct) via the arrayLength template
parameter.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3351 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Tyler Dauwalder 2003-05-27 07:58:08 +00:00
parent 4873cabb06
commit 4627317bcd
1 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,83 @@
//----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
//---------------------------------------------------------------------
#ifndef _UDF_ARRAY_H
#define _UDF_ARRAY_H
#include "cpp.h"
#include "SupportDefs.h"
namespace UDF {
/*! \brief Slightly more typesafe static array type than built-in arrays,
with array length information stored implicitly (i.e. consuming no
physical space in the actual struct) via the \c arrayLength template
parameter.
*/
template<typename DataType, uint32 arrayLength>
struct array {
public:
void dump() {
for (uint32 i = 0; i < arrayLength; i++)
data[i].print();
}
uint32 length() const { return arrayLength; }
uint32 size() const { return arrayLength * sizeof(DataType); }
DataType data[arrayLength];
};
/*! \brief \c uint8 specialization of the \c array template struct.
*/
template<uint32 arrayLength>
struct array<uint8, arrayLength> {
void dump()
{
const uint8 bytesPerRow = 8;
char classname[40];
sprintf(classname, "array<uint8, %ld>", arrayLength);
DUMP_INIT(CF_PUBLIC | CF_DUMP | CF_HIGH_VOLUME, classname);
for (uint32 i = 0; i < arrayLength; i++) {
if (i % bytesPerRow == 0)
PRINT(("[%ld:%ld]: ", i, i+bytesPerRow-1));
SIMPLE_PRINT(("0x%.2x ", data[i]));
if ((i+1) % bytesPerRow == 0 || i+1 == arrayLength)
SIMPLE_PRINT(("\n"));
}
}
uint8 data[arrayLength];
};
/*! \brief \c char specialization of the \c array template struct.
*/
template<uint32 arrayLength>
struct array<char, arrayLength> {
void dump()
{
const uint8 bytesPerRow = 8;
char classname[40];
sprintf(classname, "array<uint8, %ld>", arrayLength);
DUMP_INIT(CF_PUBLIC | CF_DUMP | CF_HIGH_VOLUME, classname);
for (uint32 i = 0; i < arrayLength; i++) {
if (i % bytesPerRow == 0)
PRINT(("[%ld:%ld]: ", i, i+bytesPerRow-1));
SIMPLE_PRINT(("0x%.2x ", data[i]));
if ((i+1) % bytesPerRow == 0 || i+1 == arrayLength)
SIMPLE_PRINT(("\n"));
}
}
uint8 data[arrayLength];
};
}; // namespace UDF
#endif // _UDF_ARRAY_H