硬汉嵌入式论坛

 找回密码
 立即注册
查看: 769|回复: 0
收起左侧

[其它] 再开源一个C++模板环形队列类,避免重复造轮子。

[复制链接]

8

主题

26

回帖

55

积分

初级会员

积分
55
发表于 2021-12-31 11:01:14 | 显示全部楼层 |阅读模式
大家最好不要在中断里面用STL.在业务层可以用。
/*****************************************************************
  Copyright (c), 2020-2021, tengye DH Biotechnology Co., Ltd
  Description:     
环形队列
可以用在中断中快速读取,性能非常接近C语言。
*****************************************************************/
#ifndef    __circularqueue_H
#define    __circularqueue_H

#include <assert.h>
#ifndef NULL
    #define NULL 0
#endif
template <typename T>
class CircularQueue
{
public:
    CircularQueue(int maxData, T* buf)
    {
        Init(maxData, buf);
    }

    CircularQueue()
    {
        m_buf     = NULL;
        m_maxData = 0;
        m_front   = 0;
        m_rear    = 0;
    }
               
    virtual ~CircularQueue()
    {
    }
                 
public:
    void Init(int maxData, T* buf)
    {
        assert(maxData > 1);
        assert(buf != NULL);

        m_buf     = buf;
        m_maxData = maxData;
        m_front   = 0;
        m_rear    = 0;
    }

    bool Pop(T& ret)
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        if (m_rear != m_front)
        {
            int front = (m_front + 1) % m_maxData;
            ret = m_buf[front];
            m_front = front;

            return true;
        }
        else
        {
            return false;
        }
    }

    bool Front(T& ret)
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        if (m_rear != m_front)
        {
            int front = (m_front + 1) % m_maxData;
            ret = m_buf[front];

            return true;
        }
        else
        {
            return false;
        }
    }

    bool Push(T& dat)
    {
        const T& ref = dat;
        return Push(ref);
    }
               
    bool Push(const T& dat)
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        int rear = (m_rear + 1) % m_maxData;

        if (rear != m_front)
        {
            m_buf[rear] = dat;
            m_rear = rear;

            return true;
        }
        else
        {
            return false;
        }
    }               
    inline int GetElementCount()
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        return (m_rear + m_maxData - m_front) % m_maxData;
    }

    inline int GetCanPushMaxSize()
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        return m_maxData - 1;
    }

    inline void Flush()
    {
        assert(m_maxData > 1);
        assert(m_buf != NULL);

        m_front = 0;
        m_rear = 0;
    }

protected:
    int  m_front;
    int  m_rear;
    int  m_maxData;
    T*   m_buf;
};

#endif

评分

参与人数 1金币 +10 收起 理由
dwj00 + 10 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 13:39 , Processed in 0.257689 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表