From df54fd094b3f2cbd4ed340c5fd9833792854540a Mon Sep 17 00:00:00 2001 From: caiyuzheng <290198252@qq.com> Date: Fri, 14 May 2021 00:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84ringbuffer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- general/cp.exe | Bin 0 -> 101288 bytes general/src/algorithm/sorter.hpp | 5 +-- general/src/pattern/ringbuffer.hpp | 66 +++++++++++++++++++++++++---- test/src/cpp11/cpp11_test.cpp | 16 ++++--- 4 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 general/cp.exe diff --git a/general/cp.exe b/general/cp.exe new file mode 100644 index 0000000000000000000000000000000000000000..b4e6b42cf97f6a4b8647b7a1394316b3ee61bf71 GIT binary patch literal 101288 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

}7c>S1oU;Z77qg zg=OkJJnM4DO+AdlS5C+y>>)U0uJ#DaF^cP~-+T1^_n&!!k=m*Rk011CIoa;1*2Iy< z6M_qY{5>VO5Xs-u;EFKtesCn(ddX8=C2yPvk^l5mSM$!b7~_ zZ150a77wd#;Xa|_@#VwdVr7d;w@Gkb8JF~~P&h>gUn4j#Pe_EX3C@!c&NY)8#V$A3 zLR26A>%`t%SIa|7*1duY0gcsFs`wYf>v<%A))nR}Vj?g2JwCjl zuB?trpXzxR&IJsY8m9gg)a7|b;Yu{E9pLiJj->m%;AlC)|2SOa6oIW~zil{g-`BQs zr>JTrZ=+kU8#`3eQkEHG)?~RQ)##F1M}t zYZ1IbCv>ggrv9%JJk+GZ-03xs0TI668*b$NvY^Pw4shN!R`}n%k^1t`3hON|EmKLa zWxeM$%?)54HisP5;Tg1aZ=J-15wsRk_enT~U>p6P#9+Sw3yXjI3$XW>)7;FaKZdonL4jMHI$MOKW|wrcy#5 zY6)U#6t3O-CpR0Y7>i;oQlcmpR5mwFVg#)bDHIWjs3i(YK#?K}>4WwnK18S*1SMb# zL0U-OTJTSNDbWWFR%k>)zcb&=?tHgNAEb|lyXlZ%U*lxnqF8Sk;{IaC^|_YBnFc;k1M+)m5sc zBST$DqukZ#ao2_|*}Es2mG0KSyY-@b179V3!gmSYL-GI5+9P0J+vC?^j}`u1@7%WH z_v{TZxf!H$V@z%Xx%H-)+zXP5PX=N?Mdl;0+QjEIka0K^K5v8cZHh?~B#{<=4l*xM z=RhXK=R1%IsmnIbrIH!j)z(c)p7nUtot3_C0cjJTogmYaCjl7~pF2U0OM4zPBJFts zq+iH$AfrNF1(}q(uw`xCQ6VQlwxK6zfWLyLK>8%lHx?x=TmTuBJU@Z-iqEegZQ}D6 z$h`Dx6DG~P)U^X-N_@&7qmub9kbcR$A7tB>xED`?%wu{M{W=12UNXM|^2hbD&pRM( z;&Z~Hq^?guI>qNpkY4GQKDu*5+P?m z1|-jdMM>?yfQ*aJWspvp&s!03P<(cRG$l{ne58dBfXqr%1~Mb$S&&hQdI4lgdU4E% zjQqPGbCTyn5Sys@_igDk)~xt!K#mT{ zyai-gTDSvbMe^(hS%;&@Tr(n3`#^ey8~`~kwLcEhiKEE#^c6m@gG@`FlOR))=PQen zUVIBOhNH-Q0amB@Tm+euJb!|8NYqBuyexfh2bmSJ3#3<~svu+HvmazY$YUTYIEoh9 zJ@NOAF?k8(yhObLGAZOF$OMie&nZ}QLTu)4mlmD_S&}>#EJDc7Mr6b;gCs)i{Bg9)gvb$YgJPw$& zqoxf#BiA~-2Um@0=#o7dRU(#cTwVFxiP0P5U#NdM^5P(ECzP>B36hT zhBPTBMXt~L#>P4vPY1<@mdz2n*{E%ktuj#~ZOr?KK1P-gY^3?GHS@1X7;P+IwxD9t zy029o3RSx81T-)YP1Ew>)ZJ)=s}${g@bS?W0#9T!1ep`ySPXg|EvJ05h?&V7)*cH% zjpZq7r@SMO3L7oLJy9s%^bGB6+2z5Lt6Y}o2@^tXirFR*#&{`?My`F+^l~B%+4JGu zojlKSB>59K8NcXokmq?aOsaeXgko$iAn<}{%Og-8oTwsqUt?bcb9vF22Gv@Y{f+|~ z+`_ #include + using namespace std; template class CompareHanlder{ @@ -147,11 +148,7 @@ void PreOrderTraverse(BSTNode *data) template int heapsort(T *data,uint64_t len,CompareHanlder handle){ buildMaxHeap(data, len); //先建立最大堆,最大堆只能保证根节点比左右两个子树还大 - - - // todo } - #endif //GENERAL_SORTER_H diff --git a/general/src/pattern/ringbuffer.hpp b/general/src/pattern/ringbuffer.hpp index 6e381c2..09c44fb 100644 --- a/general/src/pattern/ringbuffer.hpp +++ b/general/src/pattern/ringbuffer.hpp @@ -1,5 +1,6 @@ #ifndef __RINGBUFFER__ #define __RINGBUFFER__ +#include /** * author : caiyuzheng @@ -14,6 +15,8 @@ public: int Take(T *data,uint64_t len); uint32_t CanReadCount(); uint32_t CanWriteCount(); + uint32_t Size(); + ~RingBuffer(); protected: @@ -21,6 +24,7 @@ protected: uint64_t mSize; uint64_t mCurrentTail; uint64_t mCurrentHead; + uint16_t mRemain; }; /** @@ -35,12 +39,19 @@ RingBuffer::RingBuffer(uint64_t size) : mCurrentHead(0) { mSize = size; mData = new T[size]; + mRemain = mSize; } + template RingBuffer::~RingBuffer(){ delete[] mData; } +template +uint32_t RingBuffer::Size(){ + return mSize; +} + template T RingBuffer::At(uint64_t pos){ return mData[pos]; @@ -51,18 +62,57 @@ int RingBuffer::Add(T *data,uint64_t len){ if(data == nullptr){ return -1; } - /// 0->n |start|head|.....|tail| - if(mCurrentTail > mCurrentHead){ - if(mCurrentTail + len > mSize - 1){ - uint64_t tmp = mCurrentTail + len - mSize; - for(uint32_t i = 0;i < len;i++){ - if(mCurrentTail < mSize){ - data[mCurrentTail++] = data[len]; - } + // buffer already full + if(mRemain == 0){ + return -2; + } + uint16_t bytes_write; + if(len > mRemain){ + bytes_write = mRemain; + }else{ + bytes_write = len; + } + + if(mCurrentTail == mCurrentHead){ + /// |start also head also tail|...|end| + if(mCurrentHead == 0){ + memcpy(mData,data,bytes_write); + }else{ + /// |start |...| head also tail|...|end| + if(mCurrentTail + bytes_write < mSize){ + memcpy(&mData[mCurrentTail],data,(bytes_write)*sizeof(T)); + mCurrentTail += bytes_write; + }else{ + memcpy(&mData[mCurrentTail],data,(mSize - mCurrentTail)*sizeof(T)); + memcpy(&mData[0],data,(mCurrentTail + bytes_write)%mSize); + mCurrentTail = (mCurrentTail + bytes_write)%mSize; } } } + /// |start|head|.....|tail|end| + if(mCurrentTail > mCurrentHead){ + uint16_t off = mCurrentTail + bytes_write; + if(off > mSize){ + memcpy(&mData[mCurrentTail],data, + sizeof(T)*(mSize - mCurrentTail)); + memcpy(mData,data + sizeof(T)*(mSize - mCurrentTail), + (bytes_write - (mSize - mCurrentTail))*sizeof(T)); + } + if(off <= mSize){ + memcpy(&mData[mCurrentTail],data, + sizeof(T)*bytes_write); + } + } + /// |start|...|tail|.....|head|...|end| + if(mCurrentHead > mCurrentTail){ + memcpy(&mData[mCurrentTail],data,sizeof(T)*(bytes_write)); + } + mRemain -= bytes_write; + return bytes_write; } + + + template int RingBuffer::Take(T *data,uint64_t len){ diff --git a/test/src/cpp11/cpp11_test.cpp b/test/src/cpp11/cpp11_test.cpp index 40fe11e..e290946 100644 --- a/test/src/cpp11/cpp11_test.cpp +++ b/test/src/cpp11/cpp11_test.cpp @@ -7,6 +7,7 @@ using namespace std; #include "thread_usage.h" #include "threadpool.h" #include "json.h" +#include "template.h" extern "C"{ #include @@ -14,11 +15,12 @@ extern "C"{ } int main(){ - std::cout<<"test start"<