blob: 47b961bd9088492f11d703e5c01b3a08773983a1 [file] [log] [blame]
#pragma once
/**
@file hei_chip_data_stream.hpp
@brief Description: The ChipDataStream class
ChipDataStream makes it possible to read a buffer of binary data using the
stream operators, ">>".
Instantiate ChipDataStream class with a pointer to a data buffer
and its size in bytes as below:
ChipDataStream cds(streamData,552);
Use the ">>" stream operator then to read the basic integral types
(bool, char, uint8_t, int8_t, uint16_t, int16_t, uint32_t,
int32_t, uint64_t, and int64_t).
Endian issues are taken care of by template specialization.
**/
#include <endian.h>
#include <string.h>
#include <hei_includes.hpp>
namespace libhei
{
/**
* ChipDataStream
* ChipDataStream offers convenient stream operator access to binary data.
**/
class ChipDataStream
{
private:
/** iv_buffer points to the first address of the Chip Data File
buffer. **/
const void* const iv_buffer;
/** iv_bufferSize is the size of the data buffer. It is
initialized when the ChipDataStream class is instantiated. **/
const size_t iv_bufferSize;
/** iv_asyncOffset keeps an offset into the buffer. This
offset is incremented appropriately as data is read. **/
size_t iv_asyncOffset;
public:
/* Constructors */
/**
When instantiating the ChipDataStream object a pointer to a
data buffer containing all the data and its size is passed
into the class.
**/
ChipDataStream(void* i_buffer, size_t i_bufferSize) :
iv_asyncOffset(0), iv_buffer(i_buffer), iv_bufferSize(i_bufferSize)
{}
/** Eliminate copy and assignment operator constructors **/
ChipDataStream(const ChipDataStream&) = delete;
ChipDataStream& operator=(const ChipDataStream&) = delete;
/** Destructor **/
~ChipDataStream() = default;
/** Functions **/
/**
*@brief Default case for "operator>>" template.
*@param D: A type
*@param o_right: A pointer to where the data is stored
*@return *this: A pointer to "this" object
**/
template <class D>
ChipDataStream& operator>>(D& o_right)
{
read(&o_right, sizeof(D));
return *this;
}
private:
/**
*@brief Read does the copy from the buffer
*@param o_buf a pointer to the location to copy to
*@param i_size the size (in bytes) to copy
*@return None\n\n
**/
void read(void* o_buf, size_t i_size)
{
/* Ensure memory is not accessed outside i_buffer */
HEI_ASSERT((iv_asyncOffset + i_size) <= iv_bufferSize);
/* Copy appropriate bytes from i_buffer to o_buff */
memcpy(o_buf, (char*)iv_buffer + iv_asyncOffset, i_size);
/* Increment asynchronous offset to next piece of data */
iv_asyncOffset = iv_asyncOffset + i_size;
}
};
/*
* Note: The specializations below ensure the big-endian Chip Data File
* format is converted into the host format.
*/
/**
* @brief This template extracts a uint16_t data type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(uint16_t& o_right)
{
read(&o_right, sizeof(o_right));
be16toh(o_right);
return *this;
}
/**@brief This template extracts an int16_t type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(int16_t& o_right)
{
read(&o_right, sizeof(o_right));
be16toh(o_right);
return *this;
}
/**@brief This template extracts a uint32_t type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(uint32_t& o_right)
{
read(&o_right, sizeof(o_right));
be32toh(o_right);
return *this;
}
/**@brief This template extracts an int32_t type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(int32_t& o_right)
{
read(&o_right, sizeof(o_right));
be32toh(o_right);
return *this;
}
/**@brief This template extracts a uint64_t type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(uint64_t& o_right)
{
read(&o_right, sizeof(o_right));
be64toh(o_right);
return *this;
}
/**@brief This template extracts an int64_t type from the data buffer
* @param o_right: A pointer to where the data is stored
* @return *this: A pointer to "this" object
**/
template <>
inline ChipDataStream& ChipDataStream::operator>>(int64_t& o_right)
{
read(&o_right, sizeof(o_right));
be64toh(o_right);
return *this;
}
} // namespace libhei