/*
 *  deque.h - a deque as a dynamic array of fixed-size arrays
 *  Copyright (C) 2010 Martin Broadhurst
 *  www.martinbroadhurst.com
 */

#ifndef DEQUE_H
#define DEQUE_H

#include <dynarray.h>
#include <mbcommon.h>
#include <iterator.h>

typedef struct {
    MBdynarray *arrays;
    unsigned int arraysize;
    unsigned int front;
    unsigned int back;
    unsigned int firstempty;
    unsigned int lastempty;
    unsigned int count;
} MBdeque;

MBdeque * MBdeque_create(void);
void MBdeque_delete(MBdeque * deque);
void MBdeque_push_front(MBdeque * deque, void * data);
void MBdeque_push_back(MBdeque * deque, void * data);
void * MBdeque_pop_front(MBdeque * deque);
void * MBdeque_pop_back(MBdeque * deque);
void * MBdeque_get_at(const MBdeque *deque, unsigned int index);
void * MBdeque_set_at(MBdeque *deque, unsigned int index, void * data);
void * MBdeque_peek_front(const MBdeque * deque);
void * MBdeque_peek_back(const MBdeque * deque);
void MBdeque_for_each(const MBdeque * deque, MBforfn forfn);
MBiterator * MBdeque_iterator(const MBdeque * deque);
unsigned int MBdeque_get_count(const MBdeque *deque);

#endif /* DEQUE_H */