Page 194
                    #include "Arduino.h"
#include "FiFoQ.h"
struct FiFoNode 
{
  void *data;
  struct FiFoNode* next;
};
struct FiFoQ
{
  struct FiFoNode* head;
  struct FiFoNode* tail;
  int count;
  size_t dataSize;
};
                    Page 195
                    struct FiFoQ* newQueue(size_t memSize){
  struct FiFoQ* p = malloc(sizeof(struct FiFoQ));
  p->head = p->tail = NULL;
  p->dataSize = memSize;
  p->count = 0;
  return p;      
}
bool queueAdd(struct FiFoQ* fq, void* dta) {
  struct FiFoNode* node = malloc(sizeof(struct FiFoNode));
  if(node == NULL) {
    return false;
  }
  node->next = NULL;
  void* dat = malloc(fq->dataSize);
  if(dat == NULL) {
    free(node);
    return false;
  }
  memcpy(dat, dta, fq->dataSize);
  node->data = dat;
  if(fq->head == NULL) {
    fq->head = fq->tail = node;
  } else {
    fq->tail->next = node;
    fq->tail = node;
  }
  fq->count++;
  return true;
}
                    Page 196
                    void* readFirst(const struct FiFoQ* fp) {
  struct FiFoNode* p = fp->head;
  if(p) {
    return p->data;
  } else {
    return NULL;
  }
}
bool deQueue(struct FiFoQ* fp){
  if(fp->head == NULL) {
    // already empty
    return false;
  }
  struct FiFoNode* node = fp->head;
  struct FiFoNode* nxt = node->next;
  free(node->data);
  free(node);
  fp->head = nxt;
  if(nxt == NULL) {
    fp->tail = NULL;
  }
  fp->count--;
  return true;
}
int getQCount(const struct FiFoQ* fp) {
  return fp->count;
}
                    Page 197
                    void zapQueue(struct FiFoQ* fp){
  bool res = deQueue(fp);
  while(res){
    res = deQueue(fp);
  }
  free(fp);
}
                    
                    #ifndef FiFoQ_h
#define FiFoQ_h
struct FiFoNode;
struct FiFoQ;
typedef struct FiFoQ* FiFoQPointer;
struct FiFoQ* newQueue(size_t memSize);
bool queueAdd(struct FiFoQ* fq, void* dta);
void* readFirst(const struct FiFoQ* fp);
bool deQueue(struct FiFoQ* fp);
void zapQueue(struct FiFoQ* fp);
int getQCount(const struct FiFoQ* fp);
#endif
                    
                    extern "C"{
  #include "FiFoQ.h"
}
template<class T> inline Print &operator <<(Print &obj, T arg) { obj.print(arg); return obj; } 
struct MyData {
  int myVal;
  int yourVal;
};
FiFoQPointer myQ;
                    Page 198
                    void setup() {
  Serial.begin(115200);
  MyData myData;
  MyData* mDta;
  myQ = newQueue(sizeof(MyData));
  for(int i = 1; i < 21; i++) {
    myData.myVal = i << 2;
    myData.yourVal = i;
    queueAdd(myQ, &myData);
  }
  Serial << "Queue has " << getQCount(myQ) << " items loaded\n";
  mDta = readFirst(myQ);
  while(mDta) {
    Serial << "Read myval: " << mDta->myVal << " yourVal: " << 
           mDta->yourVal << "\n";
    deQueue(myQ);
    mDta = readFirst(myQ);
  }
  Serial << "Queue now has " << getQCount(myQ) << " items\n";
  zapQueue(myQ);
}
                    
                    extern "C"{
  #include <FiFoQ.h>
}
                 
                Some complete program listings can be found on the next page...