NVMain詳解

本節主要探討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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章