/*
* QueueList.h
*
* Library implementing a generic, dynamic queue (linked list version).
*
* ---
*
* Copyright (C) 2010 Efstathios Chatzikyriakidis (contact@efxa.org)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* ---
*
* Version 1.0
*
* 2010-09-28 Efstathios Chatzikyriakidis
*
* - added exit(), blink(): error reporting and handling methods.
*
* 2010-09-25 Alexander Brevig
*
* - added setPrinter(): indirectly reference a Serial object.
*
* 2010-09-20 Efstathios Chatzikyriakidis
*
* - initial release of the library.
*
* ---
*
* For the latest version see: http://www.arduino.cc/
*/
// header defining the interface of the source.
#ifndef _QUEUELIST_H
#define _QUEUELIST_H
// include Arduino basic header.
#include
// the definition of the queue class.
template
class QueueList {
public:
// init the queue (constructor).
QueueList ();
// clear the queue (destructor).
~QueueList ();
// push an item to the queue.
void push (const T i);
// pop an item from the queue.
T pop ();
// get an item from the queue.
T peek () const;
// check if the queue is empty.
bool isEmpty () const;
// get the number of items in the queue.
int count () const;
// set the printer of the queue.
void setPrinter (Print & p);
private:
// exit report method in case of error.
void exit (const char * m) const;
// led blinking method in case of error.
void blink () const;
// the pin number of the on-board led.
static const int ledPin = D7;
// the structure of each node in the list.
typedef struct node {
T item; // the item in the node.
node * next; // the next node in the list.
} node;
typedef node * link; // synonym for pointer to a node.
Print * printer; // the printer of the queue.
int size; // the size of the queue.
link head; // the head of the list.
link tail; // the tail of the list.
};
// init the queue (constructor).
template
QueueList::QueueList () {
size = 0; // set the size of queue to zero.
head = NULL; // set the head of the list to point nowhere.
tail = NULL; // set the tail of the list to point nowhere.
printer = NULL; // set the printer of queue to point nowhere.
}
// clear the queue (destructor).
template
QueueList::~QueueList () {
// deallocate memory space of each node in the list.
for (link t = head; t != NULL; head = t) {
t = head->next; delete head;
}
size = 0; // set the size of queue to zero.
tail = NULL; // set the tail of the list to point nowhere.
printer = NULL; // set the printer of queue to point nowhere.
}
// push an item to the queue.
template
void QueueList::push (const T i) {
// create a temporary pointer to tail.
link t = tail;
// create a new node for the tail.
tail = (link) new node;
// if there is a memory allocation error.
if (tail == NULL)
exit ("QUEUE: insufficient memory to create a new node.");
// set the next of the new node.
tail->next = NULL;
// store the item to the new node.
tail->item = i;
// check if the queue is empty.
if (isEmpty ())
// make the new node the head of the list.
head = tail;
else
// make the new node the tail of the list.
t->next = tail;
// increase the items.
size++;
}
// pop an item from the queue.
template
T QueueList::pop () {
// check if the queue is empty.
if (isEmpty ())
exit ("QUEUE: can't pop item from queue: queue is empty.");
// get the item of the head node.
T item = head->item;
// remove only the head node.
link t = head->next; delete head; head = t;
// decrease the items.
size--;
// return the item.
return item;
}
// get an item from the queue.
template
T QueueList::peek () const {
// check if the queue is empty.
if (isEmpty ())
exit ("QUEUE: can't peek item from queue: queue is empty.");
// return the item of the head node.
return head->item;
}
// check if the queue is empty.
template
bool QueueList::isEmpty () const {
return head == NULL;
}
// get the number of items in the queue.
template
int QueueList::count () const {
return size;
}
// set the printer of the queue.
template
void QueueList::setPrinter (Print & p) {
printer = &p;
}
// exit report method in case of error.
template
void QueueList::exit (const char * m) const {
// print the message if there is a printer.
if (printer)
printer->println (m);
// loop blinking until hardware reset.
blink ();
}
// led blinking method in case of error.
template
void QueueList::blink () const {
// set led pin as output.
pinMode (ledPin, OUTPUT);
// continue looping until hardware reset.
while (true) {
digitalWrite (ledPin, HIGH); // sets the LED on.
delay (250); // pauses 1/4 of second.
digitalWrite (ledPin, LOW); // sets the LED off.
delay (250); // pauses 1/4 of second.
}
// solution selected due to lack of exit() and assert().
}
#endif // _QUEUELIST_H