Resolve/C++ Catalog
CT/Set/Unite_1.h
Copyright © 2010, Reusable Software Research Group, The Ohio State University

//  /*-------------------------------------------------------------------*\
//  |   Concrete Template : Set_Unite_1
//  \*-------------------------------------------------------------------*/

#ifndef CT_SET_UNITE_1
#define CT_SET_UNITE_1 1

///------------------------------------------------------------------------
/// Global Context --------------------------------------------------------
///------------------------------------------------------------------------

#include "AT/Set/Unite.h"

///------------------------------------------------------------------------
/// Interface -------------------------------------------------------------
///------------------------------------------------------------------------

concrete_template <
	concrete_instance class Item,
	concrete_instance class Set_Base
	/*!
	    implements
		abstract_instance Set_Kernel <Item>
	!*/
    >
class Set_Unite_1 :
    implements
	abstract_instance Set_Unite <Item>,
    extends
	concrete_instance Set_Base
{
public:
    
    procedure_body Unite (
            consumes Set_Unite <Item>& s
	)
    {
	if (self.Size () < s.Size ())
	{
	    self &= s;
	}
	
	while (s.Size () > 0)
	/*!
	    alters self, s
	    maintains
		self union s = #self union #s
	    decreases
		|s|
	!*/	    
	{
	    object Item x;

	    s.Remove_Any (x);
	    if (not self.Is_Member (x))
	    {
		self.Add (x);
	    }
	}
    }

};

#endif // CT_SET_UNITE_1

Last modified: Mon Apr 09 15:34:36 EDT 2007