Queue
-----

Simple FIFO queue allowing enqueueing and dequeing from the start and end. +
This implementation only stores generic pointers to objects.
So you must take care of the objects lifetime, size etc by yourself.

Data structures
~~~~~~~~~~~~~~~

* `queue_t`
    An abstract datatype holding the queue, used by queue_* functions.

Functions
~~~~~~~~~

`queue_init()`::

    Initalize the queue and returns a pointer to it.

`queue_enqueue()`::

    Places the pointer 'obj' at the end of the queue.
+
NOTE: no data is copied, only the address 'obj' is stored in the queue.

`queue_dequeue()`::

    Removes and returns a item from the start of the queue.

`queue_isempty()`::

    Returns non zero if 'q' is empty. zero otherwise.
    
`queue_num_items`::

    Returns the number of items in 'q' at this given moment.

`queue_destroy()`::

    Free's the metadata from `queue_t`.
+
[IMPORTANT]
===========
This function does not take care of the objects in the queue, to avoid memory leaks
be sure to clear out the queue before destroying. +

[blue]#The example below assumes malloc:ed pointers is stored in the queue:#
--------------------------------------
while(!queue_isempty(queue)) {
    void *item = queue_dequeue(queue);
    if (item)
        free(item);
}
queue_destroy(queue);
--------------------------------------
===========
