/*******************************************************************************
 * Copyright (c) 2016 CEA LIST.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Created on: 25 janv. 2011
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/

#include "AvmBufferPrimitive.h"

#include <computer/EvaluationEnvironment.h>
#include <computer/ExecutionDataFactory.h>
#include <computer/ExecutionEnvironment.h>

#include <fml/executable/InstanceOfBuffer.h>

#include <fml/expression/AvmCode.h>
#include <fml/expression/BuiltinQueue.h>
#include <fml/expression/ExpressionConstructor.h>

#include <fml/runtime/Message.h>


namespace sep
{


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER APPEND
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_APPEND::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		// get the optional port parameter
		Message aMsg;
		if( ENV.mARG->at(1).is< Message >() )
		{
			aMsg = ENV.mARG->at(1);
		}
		else
		{
			BF aPort;
			if( ENV.mARG->at(1).is< InstanceOfPort >() )
			{
				aPort = ENV.mARG->at(1);
				ENV.mARG->begin(2);
			}
			else
			{
				ENV.mARG->begin(1);
			}
			aMsg = Message(ENV.mARG->outED->mRID, aPort);

			// get other parameters
			for( ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				aMsg.appendParameter( ENV.mARG->current() );
			}

AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB << "Output Message to append in buffer" << std::endl;
	aMsg.toStream(AVM_OS_TRACE);
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
		}

		// append the message in the buffer
		if( ENV.mARG->at(0).to_ptr< BaseBufferForm >()->push(aMsg) )
		{
			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}
	}

	else if( ENV.mARG->at(0).is< BuiltinContainer >() )
	{
		BuiltinContainer * bc = ENV.mARG->at(0).to_ptr< BuiltinContainer >();

		bool isAppend = false;
		for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
		{
			if( bc->add( ENV.mARG->current() ) )
			{
				isAppend = true;
			}
			else
			{
AVM_IF_DEBUG_FLAG( STATEMENT)
	AVM_OS_TRACE << "THROW UNSATISFIED << APPEND >> : "
			<<  ENV.mARG->outED->mRID.strUniqId() << " |=> "
			<< ENV.inCODE->str() << std::endl;
	AVM_OS_TRACE << "\t" << "<capacity:" << bc->capacity()
			<< "> " << bc->str() << " <=< "
			<< ENV.mARG->current().str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( STATEMENT)

				break;
			}
		}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << bc->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

		if( isAppend )
		{
			ENV.appendOutput( ENV.mARG->outED );
			return( true );
		}
	}

	return( false );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER REMOVE
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_REMOVE::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		BaseBufferForm * bbf = ENV.mARG->at(0).to_ptr< BaseBufferForm >();

		if( ENV.mARG->at(1).is< InstanceOfPort >() )
		{
AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB << "Output Message to remove in buffer:>"
			<< std::endl << TAB2 << "buffer: " << str_header( bbf->getInstance() )
			<< std::endl << TAB2 << "port  : "
			<< str_header( ENV.mARG->at(1).to_ptr< InstanceOfPort >() )
			<< std::endl << TAB2 << "buffer:av>" << bbf->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )

			bbf->remove( ENV.mARG->at(1).to_ptr< InstanceOfPort >() );

AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB2 << "buffer:ap>" << bbf->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )

		}

		ENV.appendOutput( ENV.mARG->outED );

		return( true );
	}

	else if( ENV.mARG->at(0).is< BuiltinContainer >() )
	{
		BuiltinContainer * bc = ENV.mARG->at(0).to_ptr< BuiltinContainer >();

		for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
		{
			bc->remove( ENV.mARG->current() );
		}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << bc->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

		ENV.appendOutput( ENV.mARG->outED );

		return( true );
	}

	return( false );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER CLEAR
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_CLEAR::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.mARG->at(0).to_ptr< BaseBufferForm >()->clear();
	}

	else if( ENV.mARG->at(0).is< BuiltinContainer >() )
	{
		ENV.mARG->at(0).to_ptr< BuiltinContainer >()->clear();
	}

	ENV.appendOutput( ENV.mARG->outED );

	return( true );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER RESIZE
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_RESIZE::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.mARG->at(0).to_ptr< BaseBufferForm >()->resize(
				ENV.mARG->at(1).toInteger());
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.mARG->at(0).to_ptr< BuiltinCollection >()->resize(
				ENV.mARG->at(1).toInteger());
	}

	ENV.appendOutput( ENV.mARG->outED );

	return( true );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER PUSH
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_PUSH::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		// get the optional port parameter
		Message aMsg;
		if( ENV.mARG->at(1).is< Message >() )
		{
			aMsg = ENV.mARG->at(1);
		}
		else
		{
			BF aPort;
			if( ENV.mARG->at(1).is< InstanceOfPort >() )
			{
				aPort = ENV.mARG->at(1);
				ENV.mARG->begin(2);
			}
			else
			{
				ENV.mARG->begin(1);
			}
			aMsg = Message(ENV.mARG->outED->mRID, aPort);

			// get other parameters
			for( ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				aMsg.appendParameter( ENV.mARG->current() );
			}

AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB << "Output Message to append in buffer" << std::endl;
	aMsg.toStream(AVM_OS_TRACE);
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
		}

		// append the message in the buffer
		if( ENV.mARG->at(0).to_ptr< BaseBufferForm >()->push(aMsg) )
		{
			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}
	}

	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( queue != NULL )
		{
			bool isAppend = false;
			for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				if( queue->push( ENV.mARG->current() ) )
				{
					isAppend = true;
				}
				else
				{
AVM_IF_DEBUG_FLAG( STATEMENT)
	AVM_OS_TRACE << "THROW UNSATISFIED << PUSH >> : "
			<<  ENV.mARG->outED->mRID.strUniqId() << " |=> "
			<< ENV.inCODE->str() << std::endl;
	AVM_OS_TRACE << "\t" << "<capacity:" << queue->capacity()
			<< "> " << queue->str() << " <=< "
			<< ENV.mARG->current().str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( STATEMENT)

					break;
				}
			}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

			if( isAppend )
			{
				ENV.appendOutput( ENV.mARG->outED );
				return( true );
			}
		}
		else
		{
AVM_IF_DEBUG_FLAG( STATEMENT)
	AVM_OS_TRACE << "THROW UNSATISFIED << PUSH >> : "
			<<  ENV.mARG->outED->mRID.strUniqId() << " |=> "
			<< ENV.inCODE->str() << std::endl;
	AVM_OS_TRACE << "\t" << "Unfound queue for << "
			<< ENV.mARG->at(0).str() << " >>" << std::endl;
AVM_ENDIF_DEBUG_FLAG( STATEMENT)
		}
	}

	else if( ENV.mARG->at(0).is< BuiltinContainer >() )
	{
		BuiltinContainer * bc = ENV.mARG->at(0).to_ptr< BuiltinContainer >();

		bool isAppend = false;
		for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
		{
			if( bc->add( ENV.mARG->current() ) )
			{
				isAppend = true;
			}
			else
			{
AVM_IF_DEBUG_FLAG( STATEMENT)
	AVM_OS_TRACE << "THROW UNSATISFIED << PUSH >> : "
			<<  ENV.mARG->outED->mRID.strUniqId() << " |=> "
			<< ENV.inCODE->str() << std::endl;
	AVM_OS_TRACE << "\t" << "<capacity:" << bc->capacity()
			<< "> " << bc->str() << " <=< "
			<< ENV.mARG->current().str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( STATEMENT)

				break;
			}
		}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << bc->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

		if( isAppend )
		{
			ENV.appendOutput( ENV.mARG->outED );
			return( true );
		}
	}

	return( false );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER ASSIGN_TOP
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_ASSIGN_TOP::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		// get the optional port parameter
		Message aMsg;
		if( ENV.mARG->at(1).is< Message >() )
		{
			aMsg = ENV.mARG->at(1);
		}
		else
		{
			BF aPort;
			if( ENV.mARG->at(1).is< InstanceOfPort >() )
			{
				aPort = ENV.mARG->at(1);
				ENV.mARG->begin(2);
			}
			else
			{
				ENV.mARG->begin(1);
			}
			aMsg = Message(ENV.mARG->outED->mRID, aPort);

			// get other parameters
			for( ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				aMsg.appendParameter( ENV.mARG->current() );
			}

AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB << "Output Message to assign#top in buffer" << std::endl;
	aMsg.toStream(AVM_OS_TRACE);
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
		}

		// append the message in the buffer
		if( ENV.mARG->at(0).to_ptr< BaseBufferForm >()->top( aMsg) )
		{
			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}
	}
	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( queue->nonempty() )
		{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:queue> " << queue->str() << std::endl
			<< "rvalue:> " << ENV.mARG->at(1).str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

			if( queue->top( ENV.mARG->at(1) ) )
			{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "queue> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

				ENV.appendOutput( ENV.mARG->outED );

				return( true );
			}
		}
	}

	return( false );
}


bool AvmPrimitive_ASSIGN_TOP::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		// get the optional port parameter
		Message aMsg;
		if( ENV.mARG->at(1).is< Message >() )
		{
			aMsg = ENV.mARG->at(1);
		}
		else
		{
			BF aPort;
			if( ENV.mARG->at(1).is< InstanceOfPort >() )
			{
				aPort = ENV.mARG->at(1);
			}
			aMsg = Message(ENV.mARG->outED->mRID, aPort);

			// get other parameters
			for( ENV.mARG->begin(2) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				aMsg.appendParameter( ENV.mARG->current() );
			}

AVM_IF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
	AVM_OS_TRACE << TAB << "Output Message to assign#top in buffer" << std::endl;
	aMsg.toStream(AVM_OS_TRACE);
AVM_ENDIF_DEBUG_FLAG2( BUFFER , COMMUNICATION )
		}

		// append the message in the buffer
		if( ENV.mARG->at(0).to_ptr< BaseBufferForm >()->top( aMsg) )
		{
			ENV.outVAL = aMsg;

			return( true );
		}
	}
	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( (queue != NULL) && queue->nonempty() )
		{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:queue> " << queue->str() << std::endl
			<< "rvalue:> " << ENV.mARG->at(1).str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

			if( queue->top( ENV.mARG->at(1) ) )
			{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "queue> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

				ENV.outVAL = ENV.mARG->at(1);

				return( true );
			}
		}
		else if( queue == NULL )
		{
AVM_IF_DEBUG_FLAG( STATEMENT)
	AVM_OS_TRACE << "THROW UNSATISFIED << ASSING#TOP >> : "
			<<  ENV.inED->mRID.strUniqId() << " |=> "
			<< ENV.inCODE->str() << std::endl;
	AVM_OS_TRACE << "\t" << "Unfound builtin queue for << "
			<< ENV.mARG->at(0).str() << " >>" << std::endl;
AVM_ENDIF_DEBUG_FLAG( STATEMENT)
		}
	}

	return( false );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER TOP
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_TOP::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		Message aMsg = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->top();

		if( aMsg.valid() && (ENV.mARG->count > 1) )
		{
			if( ENV.mARG->at(1).is< InstanceOfData >() &&
					ENV.mARG->at(1).to_ptr< InstanceOfData >()->isTypedMessage() )
			{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:msg> " << aMsg.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

				if( not ENV.setRvalue(ENV.mARG->outED,
						ENV.mARG->at(1).to_ptr< InstanceOfData >(), aMsg) )
				{
					return( false );
				}
			}
			else
			{
				// We have to ignore the << Buffer >>
				Message::const_iterator itValue = aMsg.beginParameters();
				Message::const_iterator endValue = aMsg.endParameters();
				ENV.mARG->begin(1);
				for( ; ENV.mARG->hasNext() && (itValue != endValue) ;
						ENV.mARG->next() , ++itValue )
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:> " << ENV.mARG->current().str() << std::endl
			<< "rvalue:> " << (*itValue).str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), (*itValue)) )
					{
						return( false );
					}
				}
			}

			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}

		return( aMsg.valid() );
	}
	else //if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( ENV.mARG->count > 1 )
		{
			BF popValue;
			for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				popValue = queue->top();

				if( popValue.invalid() )
				{
					return( false );
				}
				else
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << popValue.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), popValue) )
					{
						return( false );
					}
				}
			}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:queue> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}
	}

	return( false );
}


bool AvmPrimitive_TOP::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->top();
	}

	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
//		AVM_OS_TRACE << "queue->top :> " << ENV.mARG->at(0).str()
//				<< " = " << ENV.getWritableQueue(ENV.mARG->outED,
//						ENV.mARG->at(0)).str() << std::endl;

		ENV.outVAL = ENV.mARG->at(0).to_ptr< BuiltinQueue >()->top();
	}

	return( ENV.outVAL.valid() );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER POP
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_POP::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		Message aMsg = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->pop();

		if( aMsg.valid() && (ENV.mARG->count > 1) )
		{
			if( ENV.mARG->at(1).is< InstanceOfData >() &&
					ENV.mARG->at(1).to_ptr< InstanceOfData >()->isTypedMessage() )
			{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:msg> " << aMsg.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

				if( not ENV.setRvalue(ENV.mARG->outED,
						ENV.mARG->at(1).to_ptr< InstanceOfData >(), aMsg) )
				{
					return( false );
				}
			}
			else
			{
				// We have to ignore the << Buffer >>
				Message::const_iterator itValue = aMsg.beginParameters();
				Message::const_iterator endValue = aMsg.endParameters();
				ENV.mARG->begin(1);
				for( ; ENV.mARG->hasNext() && (itValue != endValue) ;
						ENV.mARG->next() , ++itValue )
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:> " << ENV.mARG->current().str() << std::endl
			<< "rvalue:> " << (*itValue).str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), (*itValue)) )
					{
						return( false );
					}
				}
			}

			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}

		return( aMsg.valid() );
	}
	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( ENV.mARG->count == 1 )
		{
			queue->pop();
		}
		else //if( ENV.mARG->count > 1 )
		{
			BF popValue;
			for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				popValue = queue->pop();

				if( popValue.invalid() )
				{
					return( false );
				}
				else
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:> "
			<< str_header( ENV.mARG->current().to_ptr< InstanceOfData >() )
			<< std::endl
			<< "rvalue:> " << popValue.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), popValue) )
					{
						return( false );
					}
				}
			}
		}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:queue> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

		ENV.appendOutput( ENV.mARG->outED );

		return( true );
	}

	return( false );
}


bool AvmPrimitive_POP::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->pop();
	}

	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
//		AVM_OS_TRACE << "queue :> " << ENV.mARG->at(0).str() << std::endl;

		ENV.outVAL = ENV.mARG->at(0).to_ptr< BuiltinQueue >()->pop();

//		AVM_OS_TRACE << "queue->pop :> " << ENV.mARG->at(0).str() << std::endl;
	}

	return( ENV.outVAL.valid() );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER POP FROM
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_POP_FROM::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		Message aMsg = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->pop();

		if( aMsg.valid() && (ENV.mARG->count > 1) )
		{
			if( ENV.mARG->at(1).is< InstanceOfData >() &&
					ENV.mARG->at(1).to_ptr< InstanceOfData >()->isTypedMessage() )
			{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:msg> " << aMsg.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

				if( not ENV.setRvalue(ENV.mARG->outED,
						ENV.mARG->at(1).to_ptr< InstanceOfData >(), aMsg) )
				{
					return( false );
				}
			}
			else
			{
				// We have to ignore the << Buffer >>
				Message::const_iterator itValue = aMsg.beginParameters();
				Message::const_iterator endValue = aMsg.endParameters();
				ENV.mARG->begin(1);
				for( ; ENV.mARG->hasNext() && (itValue != endValue) ;
						ENV.mARG->next() , ++itValue )
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "lvalue:> " << ENV.mARG->current().str() << std::endl
			<< "rvalue:> " << (*itValue).str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), (*itValue)) )
					{
						return( false );
					}
				}
			}

			ENV.appendOutput( ENV.mARG->outED );

			return( true );
		}

		return( aMsg.valid() );
	}
	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
		BuiltinQueue * queue = ENV.mARG->at(0).to_ptr< BuiltinQueue >();
		if( ENV.mARG->count == 1 )
		{
			queue->pop();
		}
		else //if( ENV.mARG->count > 1 )
		{
			BF popValue;
			for( ENV.mARG->begin(1) ; ENV.mARG->hasNext() ; ENV.mARG->next() )
			{
				popValue = queue->pop();

				if( popValue.invalid() )
				{
					return( false );
				}
				else
				{
AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:> " << popValue.str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

					if( not ENV.setRvalue(ENV.mARG->outED, ENV.mARG->current().
							to_ptr< InstanceOfData >(), popValue) )
					{
						return( false );
					}
				}
			}
		}

AVM_IF_DEBUG_FLAG( ASSIGNMENT )
	AVM_OS_TRACE << "rvalue:queue> " << queue->str() << std::endl;
AVM_ENDIF_DEBUG_FLAG( ASSIGNMENT )

		ENV.appendOutput( ENV.mARG->outED );

		return( true );
	}

	return( false );
}


bool AvmPrimitive_POP_FROM::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ENV.mARG->at(0).to_ptr< BaseBufferForm >()->pop();
	}

	else if( ENV.mARG->at(0).is< BuiltinQueue >() )
	{
//		AVM_OS_TRACE << "queue :> " << ENV.mARG->at(0).str() << std::endl;

		ENV.outVAL = ENV.mARG->at(0).to_ptr< BuiltinQueue >()->pop();

//		AVM_OS_TRACE << "queue->pop :> " << ENV.mARG->at(0).str() << std::endl;
	}

	return( ENV.outVAL.valid() );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER EMPTY
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_EMPTY::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->empty() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->empty() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER NONEMPTY
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_NONEMPTY::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->nonempty() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->nonempty() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER SINGLETON
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_SINGLETON::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->singleton() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->singleton() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER POPULATED
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_POPULATED::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->populated() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->populated() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER FULL
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_FULL::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->full() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->full() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER SIZE
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_SIZE::seval(EvaluationEnvironment & ENV)
{
	if( ENV.mARG->at(0).is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newInteger(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->size() );
	}

	else if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newInteger(
				ENV.mARG->at(0).to_ptr< BuiltinCollection >()->size() );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER CONTAINS
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_CONTAINS::seval(EvaluationEnvironment & ENV)
{
	/*if( container.is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(0).to_ptr< BaseBufferForm >()->
						contains( ENV.mARG->at(1) ) );
	}

	else*/ if( ENV.mARG->at(0).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean( ENV.mARG->at(0).
				to_ptr< BuiltinCollection >()->contains( ENV.mARG->at(1) ) );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(0).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER IN
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_IN::seval(EvaluationEnvironment & ENV)
{
	/*if( container.is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				ENV.mARG->at(1).to_ptr< BaseBufferForm >()->
						contains( ENV.mARG->at(0) ) );
	}

	else*/ if( ENV.mARG->at(1).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean( ENV.mARG->at(1).
				to_ptr< BuiltinCollection >()->contains( ENV.mARG->at(0) ) );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(1).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// BUFFER NOTIN
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

bool AvmPrimitive_NOTIN::seval(EvaluationEnvironment & ENV)
{
	/*if( container.is< BaseBufferForm >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean(
				! ENV.mARG->at(1).to_ptr< BaseBufferForm >()->
						contains( ENV.mARG->at(0) ) );
	}

	else*/ if( ENV.mARG->at(1).is< BuiltinCollection >() )
	{
		ENV.outVAL = ExpressionConstructor::newBoolean( not ENV.mARG->at(1).
				to_ptr< BuiltinCollection >()->contains( ENV.mARG->at(0) ) );
	}

	else
	{
		AVM_OS_FATAL_ERROR_EXIT
				<< "Unexpected a NON-BUILTIN-COLLECTION for the value << "
				<< ENV.mARG->at(1).str() << " >> !!!"
				<< SEND_EXIT;

		return( false );
	}

	return( true );
}




}
