// -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-
/*
# Copyright (c) 2000-2001 by the University of Southern California.
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation in source and binary forms for non-commercial purposes and
# without fee is hereby granted, provided that the above copyright notice
# appear in all copies and that both the copyright notice and this permission
# notice appear in supporting documentation, and that any documentation,
# advertising materials, and other materials related to such distribution and
# use acknowledge that the software was developed by the University of
# Southern California, Information Sciences Institute.  The name of the
# University may not be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THE UNIVERSITY OF SOUTHERN CALIFORNIA MAKES NO REPRESENTATIONS ABOUT THE
# SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE.  THIS SOFTWARE IS PROVIDED "AS
# IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
# LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE.
#
# Other copyrights might apply to parts of this software and are so noted when
# applicable.
# ----------------------------------------------------------------------------
#
# Primary author: Purushotham Kamath
#                 January 2001

#This material is based upon work supported by the Defense Advanced Research
#Projects Agency Information Technology Office, (NGI Multicast Applications 
#and Architecture (NMAA-ADDON), ARPA Order No. H645, Program Code No. 9A20, 
#Issued by DARPA/CMD under Contract No. MDA972-99-C-0022.
*/

#ifndef QUEUE_H
#define QUEUE_H

#include <packet.h>

const double statsloginterval= 1E-6;

//Abstraction of a FIFO/Drop tail queue of packets. Each component contains a queue. 
//Packets are queued and the component processes them in order.
class Queue
{
private: 
	int size;
	int bufferoverflows; //Count of the number of bufferoverflows
	                     //that have occurred
	int byteoverflows; //In terms of bytes
	int qsize;
	double avgqsize;
	int maxqsize;
	int pktcnt;
	int bytes; 					//Bytes in queue currently 

public:
	Packet *head;       //Packet at the head of the queue.
	Packet *tail;       //Packet at the tail of the queue.
	Queue(int qsize = 0);
	virtual ~Queue();
	int enqueue(Packet *);
	Packet *dequeue();
	int qSize(){ return bytes; } 
	virtual void dumpstats();
};


#endif

