/*-------------------------------------------------------------------------- Project: HorizonSDK File: rdt_RingBuffer.h Copyright 2009 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: 2010-04-30#$ $Rev: 15289 $ $Author: hiratsu_daisuke $ *-------------------------------------------------------------------------*/ #include "stdafx.h" #ifndef NN_RDT_RINGBUFFER_H_ #define NN_RDT_RINGBUFFER_H_ #include "rdt_Utility.h" namespace nn { namespace rdt { namespace CTR { /*! @brief これはリングバッファを表現するクラスです。 */ class RingBuffer{ public: /*! @brief 引数無しコンストラクタ。 */ RingBuffer(void); /*! @brief 引数付きコンストラクタ。 */ RingBuffer(void *pBuf, size_t len); /*! @brief 解放します。 */ ~RingBuffer(void); /*! @brief 初期化します。引数無しコンストラクタでオブジェクトを構築した場合は、 必ずこの関数を呼び出してから、他の関数を呼び出すようにして下さい。 */ void Initialize(void *pBuf, size_t len); /*! @brief 解放処理です。明示的に呼ばなくても、デストラクタで暗黙的に呼ばれます。 */ void Finalize(void); // データ列の先頭からnバイトを除去します。 // データ列の長さよりも大きな数値が指定された場合は、データの全てが除去されます。 void Pop(size_t n); // 既存のデータ列の後ろに、pBufで示されるnバイトのデータ列を付け足します。 // バッファが不足しており、与えられたデータ列を書き込めない場合にfalseを返します。 bool Push(const void *pBuf, size_t n); // データを(保持されているデータ列の先頭から)最大nバイト読み出します。 // このとき、バッファからデータ列は除去されません。 // 返値は、実際に読み出すことのできたバイト数です。 // 読み出すデータが存在しなかった場合にはゼロが返ります。 size_t Read(void *pBuf, size_t n) const; // データ列の先頭からoffsetバイトだけずれた位置から、最大nバイト読み出します。 // このとき、バッファからデータ列は除去されません。 // 返値は、実際に読み出すことのできたバイト数です。 // 読み出すデータが存在しなかった場合にはゼロが返ります。 size_t Read(void *pBuf, size_t n, size_t offset) const; // データ列がカラかどうかの判定をします。 bool IsEmpty(void) const { ASSERT(m_initialized); return m_dataLength==0; } // データ列をカラにします。 void Clear(void) { ASSERT(m_initialized); m_pHeadData = getHeadOfBuffer(); m_dataLength = 0; } // 現時点で保持されているデータ列の長さ(バイト数)を返します。 size_t GetDataSize(void) const { ASSERT(m_initialized); return m_dataLength; } // このバッファの大きさ(バイト数)を返します。 size_t GetBufferSize(void) const { ASSERT(m_initialized); return m_bufLength; } // 現時点で書き込み可能なバイト数(すなわち、空きサイズ)を返します。 size_t GetRestSize(void) const { ASSERT(m_initialized); return GetBufferSize() - GetDataSize(); } /*! @brief CUnitを用いた単体テストです。 */ static void Test(void); private: /*! @brief コピーコンストラクタは封印します。 */ RingBuffer (const RingBuffer&); /*! @brief 代入演算子は封印します。 */ RingBuffer& operator=(const RingBuffer&); // バッファの先頭アドレスを返します。 u8* getHeadOfBuffer(void) const { return m_pHeadBuffer; } // バッファの最後+1のアドレスを返します。 u8* getEndOfBuffer(void) const { return m_pHeadBuffer + m_bufLength; } // 次にデータを書き込むべき場所のアドレスを返します。 u8* getEndOfData(void) const; // Read()の下請け関数。 size_t read(void *pBuf, size_t n, size_t offset) const; // デバッグ目的。与えられたポインタは、バッファの中を指しているか? bool isValidAddress(u8 *p) const { return (getHeadOfBuffer() <= p) && (p < getEndOfBuffer()); } u8 *m_pHeadBuffer; // バッファの先頭を指します。 size_t m_bufLength; // バッファの長さ。 u8 *m_pHeadData; // (意味のある)データの先頭を指すポインタです。 // この位置からデータを読み出すことができます。 size_t m_dataLength; // 現在、保持されているデータ列の長さ。 bool m_initialized; // オブジェクトは初期化済み? u8 m_padding[3]; // パディング }; }}} // namespace nn::rdt::CTR #endif // end of NN_RDT_RINGBUFFER_H_