[comp.lang.fortran] fifo queue

chris@mimsy.UUCP (Chris Torek) (09/23/88)

In article <1038@amelia.nas.nasa.gov> fouts@lemming.nas.nasa.gov.nas.nasa.gov
[is there an echo.echo here? :-) ] (Marty Fouts) writes:
>... I can implement a fifo using an array and two integers ....
[Fortran example deleted]

>I can also do the same thing using pointers (from C):
[C example also deleted; the C version was buggy]

>Neither of these is a good substitute for (Not available in any
>language I usually use)
>
>Declare fifo to be a fifo of real;
>
>and using 'fifo = x' to add x to the end of fifo and 'x = fifo' to
>remove x from the begining of the fifo.

You just need to use a *real* language :-) .  There are languages
that can do this, although you will usually have to define the
implementation first (or borrow someone else's).

C++ gets rather close.  The syntax is a bit peculiar: you will
have to write something like

	fifo(float) f;	// uses a cpp macro hack to fake parameterised type

	f.put(x);	// add x to tail
	x = f.get();	// get x from head

The nice thing about the whole mess is that put and get can be
expanded in-line (they are, after all, trivial operations).
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@mimsy.umd.edu	Path:	uunet!mimsy!chris

wgh@Grumpy.UUCP (William G. Hutchison) (09/30/88)

In article <13711@mimsy.UUCP>, chris@mimsy.UUCP (Chris Torek) writes:
> In article <1038@amelia.nas.nasa.gov> fouts@lemming.nas.nasa.gov.nas.nasa.gov
> [is there an echo.echo here? :-) ] (Marty Fouts) writes:
> >... I can implement a fifo using an array and two integers ....
> [Fortran example deleted]
> [C example also deleted; the C version was buggy]
> >Neither of these is a good substitute for:
> >
> >Declare fifo to be a fifo of real;
> >
> >and using 'fifo = x' to add x to the end of fifo and 'x = fifo' to
> >remove x from the begining of the fifo.
> 
> You just need to use a *real* language :-).
> C++ gets rather close.  The syntax is a bit peculiar: you will
> have to write something like
> 
> 	fifo(float) f;	// uses a cpp macro hack to fake parameterised type
> 	f.put(x);	// add x to tail
> 	x = f.get();	// get x from head

Actually, C++ can do better than that!
You can define a class fifo which overloads operator=
with two functions overloading '=':
one with arguments (float, fifo) and the other with arguments (fifo, float).

Thus the syntax desired:

	f = x;           // this means put float x onto fifo f, and
	x = f;           // this means get float from head of f, and
                         // assign it to float x

will work exactly as you want, if you define fifo.h correctly in C++ !

You might also consider the alternative of leaving '=' as a plain
vanilla assignment operator (to avoid confusing the poor programmer
using the class!), but to overload <<  e.g.

	f << x;          // this means put float x onto fifo f, and
	x << f;          // this means get float from head of f, and
                         // assign it to float x

by analogy to cout << "i = " << i << "\n"; in stream.h.

Wow! C++ includes the good stuff from Ada (TM) and Modula-2, but
leaves out the dreck!  Bravo!
-- 
Bill Hutchison, DP Consultant	rutgers!cbmvax!burdvax!Grumpy!wgh
Unisys UNIX Portation Center	"What one fool can do, another can!"
P.O. Box 500, M.S. B121		Ancient Simian Proverb, quoted by
Blue Bell, PA 19424		Sylvanus P. Thompson, in _Calculus Made Easy_