/*******************************************************************************
 * 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
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/
#ifndef LOCALRUNTIME_H_
#define LOCALRUNTIME_H_

#include <base/SmartPointer.h>
#include <common/Element.h>

#include <fml/executable/BaseAvmProgram.h>

#include <fml/expression/BuiltinArray.h>

#include <fml/runtime/TableOfData.h>


namespace sep
{

class BF;

class LocalRuntime;


class LocalRuntimeElement : public Element ,
		AVM_INJECT_INSTANCE_COUNTER_CLASS( LocalRuntimeElement )
{

	friend LocalRuntime;

	AVM_DECLARE_CLONABLE_CLASS( LocalRuntimeElement )


protected:
	/**
	 * ATTRIBUTES
	 */
	const BaseAvmProgram & mProgram;

	avm_offset_t mOffset;

	TableOfData mDataTable;


public:
	/**
	 * CONSTRUCTOR
	 * Default
	 */
	LocalRuntimeElement(const BaseAvmProgram & aProgram)
	: Element( CLASS_KIND_T( LocalRuntime ) ),

	mProgram( aProgram ),
	mOffset( 0 ),
	mDataTable( aProgram.getDataSize() )
	{
		//!! NOTHING
	}

	/**
	 * CONSTRUCTOR
	 * Copy
	 */
	LocalRuntimeElement(const LocalRuntimeElement & anElement)
	: Element( anElement ),

	mProgram( anElement.mProgram ),
	mOffset( anElement.mOffset ),
	mDataTable( anElement.mDataTable )
	{
		//!! NOTHING
	}


	/**
	 * DESTRUCTOR
	 */
	virtual ~LocalRuntimeElement()
	{
		//!! NOTHING
	}


	/**
	 * Serialization
	 */
	virtual void toStream(OutStream & os) const;

};




class LocalRuntime :
		public SmartPointer< LocalRuntimeElement , DestroyElementPolicy >,
		AVM_INJECT_INSTANCE_COUNTER_CLASS( LocalRuntime )
{

private:
	/**
	 * TYPEDEF
	 */
	typedef SmartPointer< LocalRuntimeElement ,
						DestroyElementPolicy >  base_this_type;


public:
	/*
	 * STATIC ATTRIBUTES
	 */
	static LocalRuntime _NULL_;


public:
	/**
	 * CONSTRUCTOR
	 * Default
	 */
	LocalRuntime()
	: base_this_type( )
	{
		//!! NOTHING
	}

	LocalRuntime(const BaseAvmProgram & aProgram)
	: base_this_type( new LocalRuntimeElement(aProgram) )
	{
		//!! NOTHING
	}

	/**
	 * CONSTRUCTOR
	 * Copy
	 */
	LocalRuntime(const LocalRuntime & anElement)
	: base_this_type( anElement )
	{
		//!! NOTHING
	}


	/**
	 * DESTRUCTOR
	 */
	virtual ~LocalRuntime()
	{
		//!! NOTHING
	}


	/**
	 * GETTER - SETTER
	 * mProgram
	 */
	inline const BaseAvmProgram * getProgram() const
	{
		return( &( base_this_type::mPTR->mProgram ) );
	}


	/**
	 * GETTER - SETTER
	 * mInstance
	 */
	inline const ExecutableForm * getExecutable() const
	{
		return( getProgram()->getExecutable() );
	}


	/**
	 * GETTER - SETTER
	 * mOffset
	 */
	inline avm_offset_t getOffset() const
	{
		return( base_this_type::mPTR->mOffset );
	}

	inline void setOffset(avm_offset_t anOffset) const
	{
		base_this_type::mPTR->mOffset = anOffset;
	}


	/**
	 * GETTER - SETTER
	 * mDataTable
	 */
	inline TableOfData & getDataTable()
	{
		return( base_this_type::mPTR->mDataTable );
	}

	inline const TableOfData & getDataTable() const
	{
		return( base_this_type::mPTR->mDataTable );
	}


	inline BF & getData(avm_size_t index) const
	{
		return( base_this_type::mPTR->mDataTable.at(index) );
	}

	inline bool hasData() const
	{
		return( base_this_type::mPTR->mDataTable.nonempty() );
	}

	inline void setData(avm_size_t index, const BF & aData) const
	{
		base_this_type::mPTR->mDataTable.set(index, aData);
	}


	/**
	 * Serialization
	 */
	inline void toStream(OutStream & os) const
	{
		if( base_this_type::mPTR != NULL )
		{
			base_this_type::mPTR->toStream(os);
		}
		else
		{
			os << "LocalRuntime<null>" << std::flush;
		}
	}

};


/**
 * Stack of LocalRuntime
 */
class StackOfLocalRuntime :  public AvmObject ,
		public Vector< LocalRuntime > ,
		AVM_INJECT_INSTANCE_COUNTER_CLASS( StackOfLocalRuntime )
{

	AVM_DECLARE_CLONABLE_CLASS( StackOfLocalRuntime )


public:
	/**
	 * CONSTRUCTOR
	 * Default
	 */
	StackOfLocalRuntime()
	: AvmObject( ),
	Vector< LocalRuntime >()
	{
		//!! NOTHING
	}

	/**
	 * CONSTRUCTOR
	 * Copy
	 */
	StackOfLocalRuntime(const StackOfLocalRuntime & aStack)
	: AvmObject( aStack ),
	Vector< LocalRuntime >( aStack )
	{
		//!! NOTHING
	}


	/**
	 * DESTRUCTOR
	 */
	virtual ~StackOfLocalRuntime()
	{
		//!! NOTHING
	}


	/**
	 * SETTER
	 * For LocalRuntime
	 */

	inline void setLocalRuntime(
			avm_size_t offset, const LocalRuntime & aLocalRuntime)
	{
		Vector< LocalRuntime >::set(offset, aLocalRuntime);
	}


	/**
	 * PUSH - POP
	 * anAvmProgram
	 * BaseRuntimeForm
	 */

	inline void push(const LocalRuntime & aLocalRuntime)
	{
		aLocalRuntime.setOffset( size() );
		push_back( aLocalRuntime );
	}


	inline void pop()
	{
		if( nonempty() )
		{
			pop_last();
		}
	}


	/**
	 * Serialization
	 */
	void toStream(OutStream & os) const
	{
		for( const_iterator it = begin() ; it != end() ; ++it )
		{
			os << TAB << (*it).raw_pointer()->AVM_DEBUG_REF_COUNTER()
					<< "${ := " << AVM_NO_INDENT;

			(*it).toStream(os);

			os << END_INDENT << " }" << EOL_FLUSH;
		}
	}

};


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// TYPE DEFINITION for SMART POINTER and CONTAINER
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

AVM_DEFINE_AP_CLASS( StackOfLocalRuntime )



}

#endif /*LOCALRUNTIME_H_*/
