Ring Buffer
Dependents: pseudo_comet GSwifi_sample MelInverter_sample SerialPassthrough_withRB
RingBuffer.cpp
00001 /* 00002 * mbed library for RingBuffer 00003 * Copyright (c) 2010 Hiroshi Suga 00004 * Released under the MIT License: http://mbed.org/license/mit 00005 */ 00006 00007 /** @file RingBuffer.cpp 00008 * @brief Ring Buffer 00009 */ 00010 00011 #include "RingBuffer.h" 00012 00013 RingBuffer::RingBuffer (int p_size) { 00014 size = p_size + 1; 00015 buf = new char[size]; 00016 addr_w = 0; 00017 addr_r = 0; 00018 } 00019 00020 RingBuffer::~RingBuffer () { 00021 delete [] buf; 00022 } 00023 00024 int RingBuffer::put (char dat) { 00025 int next; 00026 00027 next = (addr_w + 1) % size; 00028 if (next == addr_r) { 00029 return -1; 00030 } 00031 buf[addr_w] = dat; 00032 addr_w = next; 00033 return -1; 00034 } 00035 00036 int RingBuffer::put (char *dat, int len) { 00037 int next, i; 00038 00039 00040 for (i = 0; i < len; i ++) { 00041 next = (addr_w + 1) % size; 00042 if (next == addr_r) { 00043 break; 00044 } 00045 buf[addr_w] = dat[i]; 00046 addr_w = next; 00047 } 00048 return i; 00049 } 00050 00051 int RingBuffer::get (char *dat) { 00052 if (addr_r == addr_w) { 00053 return -1; 00054 } 00055 *dat = buf[addr_r]; 00056 addr_r = (addr_r + 1) % size; 00057 return 0; 00058 } 00059 00060 int RingBuffer::get (char *dat, int len) { 00061 int i; 00062 00063 for (i = 0; i < len; i ++) { 00064 if (addr_r == addr_w) { 00065 break; 00066 } 00067 dat[i] = buf[addr_r]; 00068 addr_r = (addr_r + 1) % size; 00069 } 00070 return i; 00071 } 00072 00073 int RingBuffer::available () { 00074 if (addr_w < addr_r) { 00075 return addr_r - addr_w - 1; 00076 } else { 00077 return (size - addr_w) + addr_r - 1; 00078 } 00079 } 00080 00081 int RingBuffer::use () { 00082 return size - available() - 1; 00083 } 00084 00085 void RingBuffer::clear () { 00086 addr_w = 0; 00087 addr_r = 0; 00088 }
Generated on Fri Jul 15 2022 22:25:04 by 1.7.2