本节主要探讨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为0NVMDataBlock::~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;
}