C/C++ RingBuf<模板>

先点一下基础点: 模板类是不能再.cpp定义的! 模板类是不能再.cpp定义的! 模板类是不能再.cpp定义的!(坑爹一上午)

RingClass.hpp

#pragma once
#include <iostream>
#include <cstring>
typedef unsigned char uint8_t;

class AudioData
{
public:
    int iChannelSize;
    short nPcmData[1000];
};
class PCM48Data
{
public:
    int iChannelSize;
    short nPcmData[48][1000];
};

class VideoData
{
public:
    int iChannelSize;
    short nYData[1000];
    short nUData[1000];
    short nVData[1000];
};


template <typename T>
class RingQueue
{
public:
    RingQueue();
    ~RingQueue();
public:
    uint8_t Init(int p_iSize);
    uint8_t Delete();
    uint8_t IsEmpty();
    uint8_t IsFull();
    uint8_t Push(T* p_pData);
    uint8_t Pop(T* p_pData);

    void Printf();
    int GetSize();
private:
    void TailAdd()
    {
        m_iTail++;
        m_iTail = m_iTail % m_iSize;
    }
    void HeadAdd()
    {
        m_iHead++;
        m_iHead = m_iHead % m_iSize;
    }

private:
    int m_iLength;
    int m_iSize;
    int m_iHead;
    int m_iTail;
    T* m_pDatas;

private:

};

template<typename T>
RingQueue<T>::RingQueue()
{
    m_iLength = 0;
    m_iSize = 0;
    m_iHead = 0;
    m_iTail = 0;
    m_pDatas = NULL;
}

template<typename T>
RingQueue<T>::~RingQueue()
{
    Delete();
}

template<typename T>
uint8_t RingQueue<T>::Init(int p_iSize)
{
    if (m_pDatas == NULL)
    {
        m_pDatas = (T *)malloc(p_iSize * sizeof(T));
        if (m_pDatas != NULL)
        {
            memset(m_pDatas, 0, p_iSize * sizeof(T));
        }
        else
        {
            return -1;
        }
        m_iSize = p_iSize;
    }
    else
    {
        return -1;
    }
    return 0;
}

template<typename T>
uint8_t RingQueue<T>::Delete()
{
    if (m_pDatas != NULL)
    {
        free(m_pDatas);
        m_pDatas = NULL;
    }
    return 0;
}

template<typename T>
uint8_t RingQueue<T>::IsEmpty()
{
    if (m_iLength == 0)
    {
        return 1;
    }
    return 0;
}

template<typename T>
uint8_t RingQueue<T>::IsFull()
{
    if (m_iLength / m_iSize)
    {
        return 1;
    }
    return 0;
}

template<typename T>
uint8_t RingQueue<T>::Push(T* p_pData)
{
    memcpy(&m_pDatas[m_iTail], p_pData, sizeof(T));
    if (IsFull())
    {
        HeadAdd();
    }
    TailAdd();
    m_iLength++;
    if (m_iLength > m_iSize)
    {
        m_iLength = m_iSize;
    }
    return 1;
}

template<typename T>
uint8_t RingQueue<T>::Pop(T* p_pData)
{
    if (IsEmpty())
    {
        return 0;//queue empty
    }
    
    memcpy(p_pData, &m_pDatas[m_iHead], sizeof(T));
    memset(&m_pDatas[m_iHead], 0, sizeof(T));
    HeadAdd();
    m_iLength--;
    return 1;
}

template<typename T>
void RingQueue<T>::Printf()
{
    printf("size=0x%x, start=%d, end=%d\n", m_iSize, m_iHead, m_iTail);
}

template<typename T>
int RingQueue<T>::GetSize()
{
    return m_iLength;
}

main.cpp

#include "RingClass.hpp"
#include <iostream>
using namespace std
int main()
{
    //RingQueue<AudioData> stRingQueue;
    RingQueue<VideoData> stRingQueue;
    int ret = stRingQueue.Init(15); 
    if (-1 == ret)
    {
        printf("RingQueue Init failed!\n");
        getchar();
        return -1;
    }

    VideoData test;
    VideoData show;
    char str[128] = { 0 };
    char tep[3][10];
    int nub = 0;
    for (int i = 1; i < 65; i++)
    {
        memset(tep, 0, sizeof(char) * 3 * 10);

        sprintf(str, "========================%d", i);
        char* temp = (char*)tep;
        memcpy(test.nUData, str, strlen(str));
        memset(tep, 0, sizeof(char) * 3 * 10);
        sprintf(str, "========================%d", ++i);

        memcpy(test.nVData, str, strlen(str));
        memset(tep, 0, sizeof(char) * 3 * 10);
        sprintf(str, "========================%d", ++i);

        memcpy(test.nYData, str, strlen(str));
        test.iChannelSize = strlen(str);
        stRingQueue.Push(&test);
    }

    stRingQueue.Printf();
    for (int i = 0; i < 11; i++)
    {
        if (stRingQueue.Pop(&show))
        {
            printf("/****************************************\n");
            char* temp = (char*)show.nUData;
            temp[26] = '\0';
            printf("%s\n", temp);

            temp = (char*)show.nVData;
            temp[26] = '\0';
            printf("%s\n", temp);

            temp = (char*)show.nYData;
            temp[26] = '\0';
            printf("%s\n", temp);
            printf("****************************************/\n");

        }
    }

    getchar();
    return 0;
}

类模板:http://www.cplusplus.com/forum/articles/14272/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。