GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Fork of GSwifi_old by gs fan

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RingBuffer.cpp Source File

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
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 }