本節主要探討NVMDataBlock這個模塊
NVMDataBlock.h文件
#ifndef __NVMDATABLOCK_H__
#define __NVMDATABLOCK_H__
#include <vector>
#include <stdint.h>
#include <ostream>
namespace NVM {
class NVMDataBlock
{
public:
NVMDataBlock( );
~NVMDataBlock( );
void SetSize( uint64_t s );
uint64_t GetSize( );
uint8_t GetByte( uint64_t byte );
void SetByte( uint64_t byte, uint8_t value );
void SetValid( bool valid );
bool IsValid( );
void Print( std::ostream& out ) const;
NVMDataBlock& operator=( const NVMDataBlock& m );
uint8_t *rawData;
private:
bool isValid;
uint64_t size;
NVMDataBlock( const NVMDataBlock& ) { }
};
};
std::ostream& operator<<( std::ostream& out, const NVM::NVMDataBlock& obj );
#endif
首先是構造函數和結構函數
NVMDataBlock( );
~NVMDataBlock( );
NVMDataBlock::NVMDataBlock( )
{
rawData = NULL;
isValid = false;
size = 0;
}
設置rawdata爲空,無效,size爲0
NVMDataBlock::~NVMDataBlock( )
{
delete[] rawData;
rawData = NULL;
}
//delete [] 表示逐個使用對象的析構函數
接下來是對size的操作
void SetSize( uint64_t s );
uint64_t GetSize( );
void NVMDataBlock::SetSize( uint64_t s )
{
assert( rawData == NULL );
rawData = new uint8_t[s];
size = s;
isValid = true;
}
// SetSize若 rawdata不爲空,則不能setsize
// 傳入的s是有多少位,rawdata是一個指向uint8_t ,有s個的指針
uint64_t NVMDataBlock::GetSize( )
{
return size;
}
接下來是對Byte的操作
uint8_t NVMDataBlock::GetByte( uint64_t byte )
{
uint8_t rv = 0;
if( isValid && byte <= size )
{
rv = *((uint8_t*)(rawData)+byte);
}
return rv;
}
//將某個特定byte取出來,輸入參數爲第幾個byte
//設置某個byte的值
void NVMDataBlock::SetByte( uint64_t byte, uint8_t value )
{
if( byte <= size )
{
rawData[byte] = value;
}
else
{
assert( false );
}
}
無需解釋了的valid值設置
void NVMDataBlock::SetValid( bool valid )
{
isValid = valid;
}
bool NVMDataBlock::IsValid( )
{
return isValid;
}
關於打印的一系列函數
void NVMDataBlock::Print( std::ostream& out ) const
{
out << std::hex;
for( uint64_t i = 0; i < size; i++ )
{
out << std::setw(2) << std::setfill('0') << (int)rawData[i];
}
out << std::dec;
}
std::ostream& operator<<( std::ostream& out, const NVMDataBlock& obj )
{
obj.Print( out );
return out;
}
//先看重載的<<,調用打印並同時返回輸出流
//
重載了 = 運算符
若 = 右值沒有set過,則不做rawData的操作返回
若有,初始化rawData(此時rawData可能有值,不過都賦值成m的就好了)
NVMDataBlock& NVMDataBlock::operator=( const NVMDataBlock& m )
{
if( m.rawData )
{
if( rawData == NULL )
rawData = new uint8_t[m.size];
memcpy(rawData, m.rawData, m.size);
}
isValid = m.isValid;
size = m.size;
return *this;
}