A few points about our implementation...
For LIFOs, the Tail always remains at 0.
FIFO's are ring buffers, so both Head and Tail move. Performance. I worry about it so you don't have to.
When FIFO is empty, Head/Tail always reset to 0. In a random Add/Remove FIFO, Head and Tail can wrap, but in a batch Add/Remove, it won't wrap.