This site contains older material on Eiffel. For the main Eiffel page, see http://www.eiffel.com.

EiffelBase class
(HTML page generated by ISE Eiffel 4.2)

Eiffel Class
indexing
	description: "Queues with a bounded physical size, implemented by arrays";
	status: "See notice at end of class";
	names: dispenser, array;
	representation: array;
	access: fixed, fifo, membership;
	size: fixed;
	contents: generic;
	date: "$Date: 2007-03-30 19:10:11 +0000 (Fri, 30 Mar 2007) $";
	revision: "$Revision: 95354 $"

class BOUNDED_QUEUE [G]

inherit
	QUEUE [G]
		redefine
			linear_representation, has
		end;
	BOUNDED [G]
		undefine
			copy, consistent, is_equal, setup
		end

creation
	make

feature -- Initialization

	make (n: INTEGER) is
			-- Create queue for at most n items.
		require
			non_negative_argument: n >= 0
		do
			create fl.make (0, n)
		ensure
			capacity_expected: capacity = n
		end;

feature -- Access

	item: G is
			-- Oldest item.
		do
			Result := fl.item (out_index)
		end;

	has (v: like item): BOOLEAN is
			-- Does queue include v?
			-- (Reference or object equality,
			-- based on object_comparison.)
		local
			i: INTEGER
		do
			if object_comparison then
				if v /= void then
					if out_index > in_index then
						from
							i := out_index
						until
							Result or i > fl.count
						loop
							Result := fl.item (i) /= void and then v.is_equal (fl.item (i));
							i := i + 1
						end;
						from
							i := 0
						until
							Result or i >= in_index
						loop
							Result := fl.item (i) /= void and then v.is_equal (fl.item (i));
							i := i + 1
						end
					else
						from
							i := out_index
						until
							Result or i >= in_index
						loop
							Result := fl.item (i) /= void and then v.is_equal (fl.item (i));
							i := i + 1
						end
					end
				end
			else
				if out_index > in_index then
					from
						i := out_index
					until
						Result or i > fl.count
					loop
						Result := v = fl.item (i);
						i := i + 1
					end;
					from
						i := 0
					until
						Result or i >= in_index
					loop
						Result := v = fl.item (i);
						i := i + 1
					end
				else
					from
						i := out_index
					until
						Result or i >= in_index
					loop
						Result := v = fl.item (i);
						i := i + 1
					end
				end
			end
		end;

feature -- Measurement

	capacity: INTEGER is
			-- Number of items that may be kept.
		do
			Result := fl.capacity - 1
		end;

	count: INTEGER is
			-- Number of items.
		local
			size: INTEGER
		do
			size := fl.capacity;
			Result := (in_index - out_index + size) \\ size
		end;

feature -- Status report

	off: BOOLEAN is
			-- Is there no current item?
		local
			size: INTEGER
		do
			if index = in_index then
				Result := true
			else
				size := fl.capacity;
				Result := count <= ((index - out_index + size) \\ size)
			end
		end;

	Prunable: BOOLEAN is true;

	Resizable: BOOLEAN is true;

	extendible: BOOLEAN is
		do
			Result := notfull
		end;

feature -- Cursor movement

	start is
			-- Move cursor to first position.
		do
			index := out_index
		end;

	finish is
			-- Move cursor to last position.
		local
			size: INTEGER
		do
			if empty then
				index := 0
			else
				size := fl.capacity;
				index := (in_index - 1 + size) \\ size
			end
		end;

	forth is
			-- Move cursor to next position.
		do
			index := (index + 1) \\ fl.capacity
		end;

feature -- Element change

	extend (v: G) is
			-- Add v as newest element.
			-- Was declared in BOUNDED_QUEUE as synonym of extend, force and put.
		do
			fl.put (v, in_index);
			in_index := (in_index + 1) \\ fl.capacity
		end;

	force (v: G) is
			-- Add v as newest element.
			-- Was declared in BOUNDED_QUEUE as synonym of extend, force and put.
		do
			fl.put (v, in_index);
			in_index := (in_index + 1) \\ fl.capacity
		end;

	put (v: G) is
			-- Add v as newest element.
			-- Was declared in BOUNDED_QUEUE as synonym of extend, force and put.
		do
			fl.put (v, in_index);
			in_index := (in_index + 1) \\ fl.capacity
		end;

	replace (v: like item) is
			-- Replace oldest item by v.
		do
			fl.put (v, out_index)
		end;

feature -- Removal

	remove is
			-- Remove oldest item.
		do
			out_index := (out_index + 1) \\ fl.capacity
		end;

	prune (v: like item) is
		do
		end;

	wipe_out is
			-- Remove all items.
		do
			out_index := 0;
			in_index := 0
		end;

feature -- Conversion

	linear_representation: ARRAYED_LIST [G] is
			-- Representation as a linear structure
			-- (in the original insertion order)
		local
			i: INTEGER
		do
			create Result.make (count);
			if out_index > in_index then
				from
					i := out_index
				until
					i > fl.count
				loop
					Result.extend (fl.item (i));
					i := i + 1
				end;
				from
					i := 1
				until
					i >= in_index
				loop
					Result.extend (fl.item (i));
					i := i + 1
				end
			else
				from
					i := out_index
				until
					i >= in_index
				loop
					Result.extend (fl.item (i));
					i := i + 1
				end
			end
		end;

feature {BOUNDED_QUEUE} -- Implementation

	out_index: INTEGER;
			-- Position of oldest item

	in_index: INTEGER;
			-- Position for next insertion

	index: INTEGER;
			-- Current position

	fl: ARRAY [G];
			-- Storage

feature -- Measurement

	occurrences (v: G): INTEGER is
		do
			if object_comparison then
				fl.compare_objects
			else
				fl.compare_references
			end;
			Result := fl.occurrences (v)
		end;

invariant

	extendible_definition: extendible = notfull;

end -- class BOUNDED_QUEUE