blob: ebc0fd8a1ff2fa2c47393ba352cdf1e1d8907092 [file] [log] [blame]
/*******************************************************************************
* 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 AVMPROGRAM_H_
#define AVMPROGRAM_H_
#include <fml/executable/BaseAvmProgram.h>
#include <common/AvmPointer.h>
#include <collection/List.h>
#include <fml/expression/AvmCode.h>
#include <fml/executable/InstanceOfBuffer.h>
#include <fml/executable/InstanceOfData.h>
#include <fml/executable/InstanceOfPort.h>
#include <fml/common/ModifierElement.h>
#include <fml/common/SpecifierElement.h>
#include <fml/type/TableOfTypeSpecifier.h>
#include <fml/infrastructure/Transition.h>
namespace sep
{
class ExecutableForm;
class ObjectElement;
class TableOfAvmProgram;
class AvmProgram :
public BaseAvmProgram ,
public IStatementFamily ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( AvmProgram )
{
AVM_DECLARE_CLONABLE_CLASS( AvmProgram )
protected:
/*
* ATTRIBUTES
*/
avm_offset_t mOffset;
Specifier::SCOPE_KIND mScope;
avm_offset_t mParamOffset;
avm_size_t mParamCount;
avm_offset_t mReturnOffset;
avm_size_t mReturnCount;
TableOfInstanceOfData mConstData;
TableOfTypeSpecifier mTableOfTypeSpecifier;
BFCode mCode;
// static class of Port/Message/Signal in communicated statement
BF mCommunicationCode;
BF mInternalCommunicationCode;
ListOfInstanceOfPort mInputCom;
ListOfInstanceOfPort mOutputCom;
ListOfInstanceOfBuffer mInputEnabledBuffer;
ListOfInstanceOfPort mInputEnabledCom;
ListOfInstanceOfPort mInputEnabledSave;
bool mMutableCommunicationFlag;
BF mEnvironmentCom;
BF mEnvironmentInputCom;
BF mEnvironmentOutputCom;
public:
/**
* STATIC
*/
static std::string ANONYM_UFI;
public:
/**
* CONSTRUCTOR
* Default
*/
AvmProgram(Specifier::SCOPE_KIND aScope, AvmProgram * aContainer,
const ObjectElement * astProgram, avm_size_t aSize)
: BaseAvmProgram(CLASS_KIND_T( AvmProgram ), aContainer, astProgram, aSize),
IStatementFamily( AVM_STATEMENT_UNDEFINED_FAMILY ),
mOffset( 0 ),
mScope( aScope ),
mParamOffset( 0 ),
mParamCount( 0 ),
mReturnOffset( 0 ),
mReturnCount( 0 ),
mConstData( ),
mTableOfTypeSpecifier( ),
mCode( ),
mCommunicationCode( ),
mInternalCommunicationCode( ),
mInputCom( ),
mOutputCom( ),
mInputEnabledBuffer( ),
mInputEnabledCom( ),
mInputEnabledSave( ),
mMutableCommunicationFlag( false ),
mEnvironmentCom( ),
mEnvironmentInputCom( ),
mEnvironmentOutputCom( )
{
updateFullyQualifiedNameID();
}
/**
* CONSTRUCTOR
* Default for Routine
*/
AvmProgram(Specifier::SCOPE_KIND aScope, AvmProgram * aContainer,
const std::string & id, avm_size_t aSize)
: BaseAvmProgram(CLASS_KIND_T( AvmProgram ), aContainer, id, aSize),
IStatementFamily( AVM_STATEMENT_UNDEFINED_FAMILY ),
mOffset( 0 ),
mScope( aScope ),
mParamOffset( 0 ),
mParamCount( 0 ),
mReturnOffset( 0 ),
mReturnCount( 0 ),
mConstData( ),
mTableOfTypeSpecifier( ),
mCode( ),
mCommunicationCode( ),
mInternalCommunicationCode( ),
mInputCom( ),
mOutputCom( ),
mInputEnabledBuffer( ),
mInputEnabledCom( ),
mInputEnabledSave( ),
mMutableCommunicationFlag( false ),
mEnvironmentCom( ),
mEnvironmentInputCom( ),
mEnvironmentOutputCom( )
{
updateFullyQualifiedNameID();
}
/**
* CONSTRUCTOR
* Copy
*/
AvmProgram(const AvmProgram & aProgram)
: BaseAvmProgram( aProgram ),
IStatementFamily( aProgram ),
mOffset( aProgram.mOffset ),
mScope( aProgram.mScope ),
mParamOffset( aProgram.mParamOffset ),
mParamCount( aProgram.mParamCount ),
mReturnOffset( aProgram.mReturnOffset ),
mReturnCount( aProgram.mReturnCount ),
mConstData( aProgram.mConstData ),
mTableOfTypeSpecifier( aProgram.mTableOfTypeSpecifier ),
mCode( aProgram.mCode ),
mCommunicationCode( aProgram.mCommunicationCode ),
mInternalCommunicationCode( aProgram.mInternalCommunicationCode ),
mInputCom( aProgram.mInputCom ),
mOutputCom( aProgram.mOutputCom ),
mInputEnabledBuffer( aProgram.mInputEnabledBuffer ),
mInputEnabledCom( aProgram.mInputEnabledCom ),
mInputEnabledSave( aProgram.mInputEnabledSave ),
mMutableCommunicationFlag( aProgram.mMutableCommunicationFlag ),
mEnvironmentCom( aProgram.mEnvironmentCom ),
mEnvironmentInputCom( aProgram.mEnvironmentInputCom ),
mEnvironmentOutputCom( aProgram.mEnvironmentOutputCom )
{
// !! NOTHING
}
/**
* CONSTRUCTOR
* Other
*/
AvmProgram(class_kind_t aClassKind,
Specifier::SCOPE_KIND aScope, AvmProgram * aContainer,
ObjectElement * aCompiled, avm_size_t aSize)
: BaseAvmProgram(aClassKind, aContainer, aCompiled, aSize),
IStatementFamily( AVM_STATEMENT_UNDEFINED_FAMILY ),
mOffset( 0 ),
mScope( aScope ),
mParamOffset( 0 ),
mParamCount( 0 ),
mReturnOffset( 0 ),
mReturnCount( 0 ),
mConstData( ),
mTableOfTypeSpecifier( ),
mCode( ),
mCommunicationCode( ),
mInternalCommunicationCode( ),
mInputCom( ),
mOutputCom( ),
mInputEnabledBuffer( ),
mInputEnabledCom( ),
mInputEnabledSave( ),
mMutableCommunicationFlag( false ),
mEnvironmentCom( ),
mEnvironmentInputCom( ),
mEnvironmentOutputCom( )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~AvmProgram()
{
//!! NOTHING
}
/**
* GETTER - SETTER
* mOffset
*/
inline avm_offset_t getOffset() const
{
return( mOffset );
}
inline void setOffset(avm_offset_t anOffset)
{
mOffset = anOffset;
}
/**
* GETTER - SETTER
* mScope
*/
inline Specifier::SCOPE_KIND getScope() const
{
return( mScope );
}
inline bool isScope(Specifier::SCOPE_KIND aScope) const
{
return( (mScope == aScope)
|| ( aScope == Specifier::SCOPE_UNDEFINED_KIND) );
}
inline void setScope(Specifier::SCOPE_KIND aScope)
{
mScope = aScope;
}
inline bool isScopeTransition() const
{
return( mScope == Specifier::SCOPE_TRANSITION_KIND );
}
inline void setScopeTransition()
{
mScope = Specifier::SCOPE_TRANSITION_KIND;
}
inline bool isScopeMachine() const
{
return( mScope == Specifier::SCOPE_MACHINE_KIND );
}
inline void setScopeMachine()
{
mScope = Specifier::SCOPE_MACHINE_KIND;
}
inline bool isScopeRoutine() const
{
return( mScope == Specifier::SCOPE_ROUTINE_KIND );
}
inline void setScopeRoutine()
{
mScope = Specifier::SCOPE_ROUTINE_KIND;
}
inline bool isScopeProgram() const
{
return( mScope == Specifier::SCOPE_PROGRAM_KIND );
}
inline void setScopeProgram()
{
mScope = Specifier::SCOPE_PROGRAM_KIND;
}
/**
* GETTER - SETTER
* mParamOffset
* mParamCount
*/
inline const BF & getParam(avm_offset_t offset) const
{
return( getData().at(offset) );
}
inline BaseTypeSpecifier * getParamTypeSpecifier(avm_offset_t offset) const
{
return( getData().rawAt(offset)->getTypeSpecifier() );
}
inline avm_offset_t getParamOffset() const
{
return( mParamOffset );
}
inline avm_size_t getParamCount() const
{
return( mParamCount );
}
inline InstanceOfData * rawParamData(avm_offset_t offset) const
{
AVM_OS_ASSERT_FATAL_ARRAY_OFFSET_EXIT( offset , mParamCount )
<< "Unbound Instance parameter offset !!!"
<< SEND_EXIT;
return( mData.rawAt(mParamOffset + offset) );
}
inline bool hasParam() const
{
return( mParamCount > 0 );
}
inline void setParamOffsetCount(avm_offset_t aParamOffset,
avm_size_t aParamCount)
{
mParamOffset = aParamOffset;
mParamCount = aParamCount;
}
/**
* GETTER - SETTER
* mReturnOffset
* mReturnCount
*/
inline const BF & getReturn(avm_offset_t offset) const
{
return( getData().at(mReturnOffset + offset) );
}
inline BaseTypeSpecifier * getReturnTypeSpecifier(avm_offset_t offset) const
{
return( getData().rawAt(mReturnOffset + offset)->getTypeSpecifier() );
}
inline avm_offset_t getReturnOffset() const
{
return( mReturnOffset );
}
inline avm_offset_t returnOffset(avm_offset_t offset) const
{
return( mReturnOffset + offset );
}
inline avm_size_t getReturnCount() const
{
return( mReturnCount );
}
inline InstanceOfData * rawReturnData(avm_offset_t offset) const
{
AVM_OS_ASSERT_FATAL_ARRAY_OFFSET_EXIT( offset , mReturnCount )
<< "Unbound Instance parameter offset !!!"
<< SEND_EXIT;
return( mData.rawAt(mReturnOffset + offset) );
}
inline bool hasReturn() const
{
return( mReturnCount > 0 );
}
inline void setReturnOffsetCount(avm_offset_t aReturnOffset,
avm_size_t aReturnCount)
{
mReturnOffset = aReturnOffset;
mReturnCount = aReturnCount;
}
/**
* GETTER
* mParamCount
* mReturnCount
*/
inline avm_size_t getParamReturnCount() const
{
return( mParamCount + mReturnCount );
}
inline bool hasParamReturn() const
{
return( (mParamCount + mReturnCount) > 0 );
}
/**
* SETTER
* mFullyQualifiedNameID
*/
virtual void updateFullyQualifiedNameID();
inline bool isAnonym() const
{
return( fqnEquals( ANONYM_UFI ) );
}
/*
* contains DATA
*/
inline bool containsData(InstanceOfData * anInstance) const
{
return( BaseAvmProgram::containsData(anInstance) ||
mConstData.contains(anInstance) );
}
/**
* GETTER - SETTER
* mConstData
*/
inline void appendConstData(const BF & anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( anInstance )
<< "InstanceOfData !!!"
<< SEND_EXIT;
anInstance.to_ptr< InstanceOfData >()->setContainer(this);
mConstData.append(anInstance);
}
inline void saveConstData(InstanceOfData * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfData !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
mConstData.save(anInstance);
}
inline const TableOfInstanceOfData & getConstData() const
{
return( mConstData );
}
inline bool hasConstData() const
{
return( mConstData.nonempty() );
}
/**
* GETTER - SETTER
* mTypeSpecifier
*/
inline void appendTypeSpecifier(const TypeSpecifier & aTypeSpecifier)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( aTypeSpecifier )
<< "TypeSpecifier !!!"
<< SEND_EXIT;
mTableOfTypeSpecifier.append(aTypeSpecifier);
}
inline TableOfTypeSpecifier & getTypeSpecifier()
{
return( mTableOfTypeSpecifier );
}
inline const TableOfTypeSpecifier & getTypeSpecifier() const
{
return( mTableOfTypeSpecifier );
}
inline const TypeSpecifier & getTypeSpecifier(avm_offset_t offset) const
{
return( mTableOfTypeSpecifier.get(offset) );
}
inline const TypeSpecifier & getTypeSpecifier(
const std::string & aFullyQualifiedNameID) const
{
return( mTableOfTypeSpecifier.getByFQNameID(
aFullyQualifiedNameID ) );
}
inline const TypeSpecifier & getTypeSpecifier(
const ObjectElement * astElement) const
{
return( mTableOfTypeSpecifier.getByAstElement(astElement) );
}
inline bool hasTypeSpecifier() const
{
return( mTableOfTypeSpecifier.nonempty() );
}
/**
* GETTER
* for EnumSymbolData
*/
inline const BF & getSymbolData(
const std::string & aFullyQualifiedNameID) const
{
return( mTableOfTypeSpecifier.getSymbolData( aFullyQualifiedNameID ) );
}
inline const BF & getSymbolDataByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
return( mTableOfTypeSpecifier.
getSymbolDataByQualifiedNameID(aQualifiedNameID) );
}
inline const BF & getSymbolDataByNameID(const std::string & aNameID) const
{
return( mTableOfTypeSpecifier.getSymbolDataByNameID( aNameID ) );
}
inline const BF & getSymbolDataByAstElement(
const ObjectElement * astElement) const
{
return( mTableOfTypeSpecifier.getSymbolDataByAstElement(astElement) );
}
/**
* GETTER - SETTER
* mCode
*/
inline BFCode & getCode()
{
return( mCode );
}
inline const BFCode & getCode() const
{
return( mCode );
}
inline bool hasCode() const
{
return( mCode.valid() );
}
inline void setCode(const BFCode & aProgram)
{
mCode = aProgram;
}
/**
* GETTER - SETTER
* IOpcodeFamily
*/
inline virtual void updateOpcodeFamily()
{
IStatementFamily::updateStatementFamily( mCode );
}
/**
* GETTER
* any SYMBOL filtering by an optional type specifier family
*/
virtual const BF & getSymbol(
const std::string & aFullyQualifiedNameID,
avm_type_specifier_kind_t typeFamily) const;
virtual const BF & getSymbolByQualifiedNameID(
const std::string & aQualifiedNameID,
avm_type_specifier_kind_t typeFamily) const;
virtual const BF & getSymbolByNameID(const std::string & aNameID,
avm_type_specifier_kind_t typeFamily) const;
virtual const BF & getymbolByAstElement(const ObjectElement * astElement,
avm_type_specifier_kind_t typeFamily) const;
/**
* GETTER - SETTER
* mCommunicationCode
*/
inline BF & getCommunicationCode()
{
return( mCommunicationCode );
}
inline const BF & getCommunicationCode() const
{
return( mCommunicationCode );
}
inline bool hasCommunicationCode() const
{
return( mCommunicationCode.valid() );
}
inline void setCommunicationCode(const BF & comCode)
{
mCommunicationCode = comCode;
}
/**
* GETTER - SETTER
* mInternalCommunicationCode
*/
inline BF & getInternalCommunicationCode()
{
return( mInternalCommunicationCode );
}
inline const BF & getInternalCommunicationCode() const
{
return( mInternalCommunicationCode );
}
inline bool hasInternalCommunicationCode() const
{
return( mInternalCommunicationCode.valid() );
}
inline void setInternalCommunicationCode(const BF & comCode)
{
mInternalCommunicationCode = comCode;
}
/**
* GETTER - SETTER
* mInputCom
*/
inline void addInputCom(InstanceOfPort * aPort)
{
mInputCom.add_union( aPort );
}
inline void addInputCom(ListOfInstanceOfPort & inputEnabledPort)
{
mInputCom.add_union( inputEnabledPort );
}
inline ListOfInstanceOfPort & getInputCom()
{
return( mInputCom );
}
inline const ListOfInstanceOfPort & getInputCom() const
{
return( mInputCom );
}
bool containsInputCom(InstanceOfPort * aPort) const
{
return( mInputCom.contains(aPort) );
}
inline bool hasInputCom() const
{
return( mInputCom.nonempty() );
}
inline void setInputCom(ListOfInstanceOfPort & inputEnabledPort)
{
mInputCom.clear();
mInputCom.add_union( inputEnabledPort );
}
/**
* GETTER - SETTER
* mOutputCom
*/
inline void addOutputCom(InstanceOfPort * aPort)
{
mOutputCom.add_union( aPort );
}
inline void addOutputCom(ListOfInstanceOfPort & inputEnabledPort)
{
mOutputCom.add_union( inputEnabledPort );
}
inline ListOfInstanceOfPort & getOutputCom()
{
return( mOutputCom );
}
inline const ListOfInstanceOfPort & getOutputCom() const
{
return( mOutputCom );
}
bool containsOutputCom(InstanceOfPort * aPort) const
{
return( mOutputCom.contains(aPort) );
}
inline bool hasOutputCom() const
{
return( mOutputCom.nonempty() );
}
inline void setOutputCom(ListOfInstanceOfPort & inputEnabledPort)
{
mOutputCom.clear();
mOutputCom.add_union( inputEnabledPort );
}
/**
* GETTER - SETTER
* mInputEnabledBuffer
*/
inline void addInputEnabledBuffer(InstanceOfBuffer * aBuffer)
{
mInputEnabledBuffer.add_union( aBuffer );
}
inline void addInputEnabledBuffer(ListOfInstanceOfBuffer & inputEnabledBuffer)
{
mInputEnabledBuffer.add_union( inputEnabledBuffer );
}
inline ListOfInstanceOfBuffer & getInputEnabledBuffer()
{
return( mInputEnabledBuffer );
}
inline const ListOfInstanceOfBuffer & getInputEnabledBuffer() const
{
return( mInputEnabledBuffer );
}
bool containsInputEnabledBuffer(InstanceOfBuffer * aBuffer) const
{
return( mInputEnabledBuffer.contains(aBuffer) );
}
inline bool hasInputEnabledBuffer() const
{
return( mInputEnabledBuffer.nonempty() );
}
inline void setInputEnabledBuffer(ListOfInstanceOfBuffer & inputEnabledBuffer)
{
mInputEnabledBuffer.clear();
mInputEnabledBuffer.add_union( inputEnabledBuffer );
}
/**
* GETTER - SETTER
* mInputEnabledCom
*/
inline void addInputEnabledCom(InstanceOfPort * aPort)
{
mInputEnabledCom.add_union( aPort );
}
inline void addInputEnabledCom(ListOfInstanceOfPort & inputEnabledPort)
{
mInputEnabledCom.add_union( inputEnabledPort );
}
inline ListOfInstanceOfPort & getInputEnabledCom()
{
return( mInputEnabledCom );
}
inline const ListOfInstanceOfPort & getInputEnabledCom() const
{
return( mInputEnabledCom );
}
bool containsInputEnabledCom(InstanceOfPort * aPort) const
{
return( mInputEnabledCom.contains(aPort) );
}
inline bool hasInputEnabledCom() const
{
return( mInputEnabledCom.nonempty() );
}
inline void setInputEnabledCom(ListOfInstanceOfPort & inputEnabledPort)
{
mInputEnabledCom.clear();
mInputEnabledCom.add_union( inputEnabledPort );
}
/**
* GETTER - SETTER
* mInputEnabledSave
*/
inline void addInputEnabledSave(InstanceOfPort * aPort)
{
mInputEnabledSave.add_union( aPort );
}
inline void addInputEnabledSave(ListOfInstanceOfPort & inputEnabledSavePort)
{
mInputEnabledSave.add_union( inputEnabledSavePort );
}
inline ListOfInstanceOfPort & getInputEnabledSave()
{
return( mInputEnabledSave );
}
inline const ListOfInstanceOfPort & getInputEnabledSave() const
{
return( mInputEnabledSave );
}
bool containsInputEnabledSave(InstanceOfPort * aPort) const
{
return( mInputEnabledSave.contains(aPort) );
}
inline bool hasInputEnabledSave() const
{
return( mInputEnabledSave.nonempty() );
}
inline void setInputEnabledSave(ListOfInstanceOfPort & inputEnabledSavePort)
{
mInputEnabledSave.clear();
mInputEnabledSave.add_union( inputEnabledSavePort );
}
/**
* GETTER - SETTER
* mMutableCommunicationFlag
* MOC Attribute for mutable Schedule
*/
bool isMutableCommunication() const
{
return( mMutableCommunicationFlag );
}
void setMutableCommunication(bool isMutableCommunication = true)
{
mMutableCommunicationFlag = isMutableCommunication;
}
/**
* GETTER - SETTER
* mEnvironmentCom
*/
inline BF & getEnvironmentCom()
{
return( mEnvironmentCom );
}
inline const BF & getEnvironmentCom() const
{
return( mEnvironmentCom );
}
inline bool hasEnvironmentCom() const
{
return( mEnvironmentCom.valid() );
}
inline void setEnvironmentCom(const BF & comCode)
{
mEnvironmentCom = comCode;
}
/**
* GETTER - SETTER
* mEnvironmentInputCom
*/
inline BF & getEnvironmentInputCom()
{
return( mEnvironmentInputCom );
}
inline const BF & getEnvironmentInputCom() const
{
return( mEnvironmentInputCom );
}
inline bool hasEnvironmentInputCom() const
{
return( mEnvironmentInputCom.valid() );
}
inline void setEnvironmentInputCom(const BF & comCode)
{
mEnvironmentInputCom = comCode;
}
/**
* GETTER - SETTER
* mEnvironmentOutputCom
*/
inline BF & getEnvironmentOutputCom()
{
return( mEnvironmentOutputCom );
}
inline const BF & getEnvironmentOutputCom() const
{
return( mEnvironmentOutputCom );
}
inline bool hasEnvironmentOutputCom() const
{
return( mEnvironmentOutputCom.valid() );
}
inline void setEnvironmentOutputCom(const BF & comCode)
{
mEnvironmentOutputCom = comCode;
}
/**
* Serialization
*/
virtual void strHeader(OutStream & out) const;
void toStreamData(OutStream & out) const;
void toStreamStaticCom(OutStream & out) const;
virtual void toStream(OutStream & out) const;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// AvmProgram
// TYPE DEFINITION for TABLE , SMART POINTER and CONTAINER
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class TableOfAvmProgram :
public TableOfBF_T< AvmProgram >,
AVM_INJECT_INSTANCE_COUNTER_CLASS( TableOfAvmProgram )
{
AVM_DECLARE_CLONABLE_CLASS( TableOfAvmProgram )
/**
* TYPEDEF
*/
typedef TableOfBF_T< AvmProgram > BaseTableOfAvmProgram;
public:
/**
* CONSTRUCTOR
* Default
*/
TableOfAvmProgram()
: BaseTableOfAvmProgram()
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
TableOfAvmProgram(const TableOfAvmProgram & aTable)
: BaseTableOfAvmProgram( aTable )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~TableOfAvmProgram()
{
//!! NOTHING
}
/**
* GETTER
* For Instance
*/
inline const BF & getByQualifiedNameID(
const std::string & aQualifiedNameID,
NamedElement::op_comparer_t op,
Specifier::SCOPE_KIND aScope) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
if( itProg->isScope(aScope)
&& static_cast< AvmProgram *>(
itProg )->compareID(aQualifiedNameID, op) )
{
return( *itProg );
}
}
return( BF::REF_NULL );
}
inline AvmProgram * rawByQualifiedNameID(
const std::string & aQualifiedNameID,
NamedElement::op_comparer_t op,
Specifier::SCOPE_KIND aScope) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
if( itProg->isScope(aScope)
&& static_cast< AvmProgram *>(
itProg )->compareID(aQualifiedNameID, op) )
{
return( itProg );
}
}
return( NULL );
}
inline const BF & getByFQNameID(const std::string & aFullyQualifiedNameID,
Specifier::SCOPE_KIND aScope = Specifier::SCOPE_UNDEFINED_KIND) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
// STRICT:> compare LOCATOR & LOCATION (true:- retry only LOCATION)
if( itProg->isScope(aScope)
&& itProg->fqnEquals( aFullyQualifiedNameID , true ) )
{
return( *itProg );
}
}
return( BF::REF_NULL );
}
inline const BF & getByQualifiedNameID(
const std::string & aQualifiedNameID,
Specifier::SCOPE_KIND aScope =
Specifier::SCOPE_UNDEFINED_KIND) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
if( itProg->isScope(aScope)
&& itProg->fqnEndsWith(aQualifiedNameID) )
{
return( *itProg );
}
}
return( BF::REF_NULL );
}
inline avm_size_t getByQualifiedNameID(
const std::string & aQualifiedNameID,
Specifier::SCOPE_KIND aScope, BFList & listofProgram) const
{
avm_size_t count = 0;
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
if( itProg->isScope(aScope)
&& itProg->fqnEndsWith(aQualifiedNameID) )
{
listofProgram.append( *itProg );
++count;
}
}
return( count );
}
inline const BF & getByNameID(const std::string & id,
Specifier::SCOPE_KIND aScope =
Specifier::SCOPE_UNDEFINED_KIND) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
if( itProg->isScope(aScope) && (itProg->getNameID() == id) )
{
return( *itProg );
}
}
return( BF::REF_NULL );
}
inline const BF & getByAstElement(const ObjectElement * astElement) const
{
BaseTableOfAvmProgram::const_raw_iterator it = begin();
BaseTableOfAvmProgram::const_raw_iterator endIt = end();
for( ; it != endIt ; ++it )
{
if( (it)->isAstElement( astElement ) )
{
return( *it );
}
}
return( BF::REF_NULL );
}
/**
* Serialization
*/
inline virtual void toStream(OutStream & os) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
itProg->toStream(os);
os << EOL;
}
}
inline virtual void fqnStream(OutStream & os) const
{
BaseTableOfAvmProgram::const_raw_iterator itProg = begin();
BaseTableOfAvmProgram::const_raw_iterator endProg = end();
for( ; itProg != endProg ; ++itProg )
{
os << TAB << itProg->getFullyQualifiedNameID() << ";" << EOL;
}
}
};
}
#endif /*AVMPROGRAM_H_*/