blob: e6fe1fdd6c5400fbc919d159ed0dcfa420ded60d [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 EXECUTABLEFORM_H_
#define EXECUTABLEFORM_H_
#include <fml/executable/AvmProgram.h>
#include <fml/common/SpecifierElement.h>
#include <base/SmartTable.h>
#include <collection/Typedef.h>
#include <collection/Vector.h>
#include <fml/expression/AvmCode.h>
#include <fml/executable/AvmTransition.h>
#include <fml/executable/BaseInstanceForm.h>
#include <fml/executable/InstanceOfBuffer.h>
#include <fml/executable/InstanceOfConnect.h>
#include <fml/executable/InstanceOfData.h>
#include <fml/executable/InstanceOfMachine.h>
#include <fml/executable/InstanceOfPort.h>
#include <fml/executable/Router.h>
#include <fml/symbol/Symbol.h>
#include <fml/symbol/TableOfSymbol.h>
#include <fml/infrastructure/InstanceSpecifierPart.h>
#include <fml/infrastructure/Machine.h>
#include <fml/infrastructure/System.h>
namespace sep
{
class AvmCode;
class ExecutableSystem;
class ObjectElement;
class Specifier;
// TYPE DEFINITION for TABLE , SMART POINTER and CONTAINER
typedef TableOfBF_T< ExecutableForm > TableOfExecutableForm;
typedef SmartTable< InstanceOfBuffer , DestroyElementPolicy > TableOfBuffer;
typedef SmartTable< InstanceOfConnect , DestroyElementPolicy > TableOfConnectT;
typedef SmartTable< InstanceOfData , DestroyElementPolicy > TableOfVariableT;
typedef SmartTable< InstanceOfMachine , DestroyElementPolicy > TableOfMachineT;
typedef SmartTable< InstanceOfPort , DestroyElementPolicy > TableOfPortT;
class ExecutableForm :
public AvmProgram ,
public SpecifierImpl,
AVM_INJECT_INSTANCE_COUNTER_CLASS( ExecutableForm )
{
AVM_DECLARE_CLONABLE_CLASS( ExecutableForm )
protected:
/*
* ATTRIBUTES
*/
ExecutableSystem & mExecutableSystem;
avm_size_t mInitialInstanceCount;
avm_size_t mMaximalInstanceCount;
avm_size_t mPossibleStaticInstanciationCount;
avm_size_t mPossibleDynamicInstanciationCount;
TableOfSymbol mTableOfChannel;
TableOfSymbol mTableOfPort;
avm_size_t mMessageSignalCount;
TableOfSymbol mTableOfBuffer;
TableOfSymbol mTableOfConnect;
TableOfSymbol mTableOfInstanceModel;
TableOfSymbol mTableOfInstanceStatic;
InstanceOfMachine * mPrototypeInstance;
TableOfSymbol mTableOfInstanceDynamic;
TableOfTransition mTableOfTransition;
TableOfAvmProgram mTableOfProgram;
TableOfAvmProgram mTableOfAnonymousInnerRoutine;
TableOfExecutableForm mTableOfExecutable;
TableOfSymbol mTableOfAlias;
// Predefined routines
AvmProgram onCreateRoutine;
AvmProgram onInitRoutine;
AvmProgram onFinalRoutine;
AvmProgram onReturnRoutine;
AvmProgram onStartRoutine;
AvmProgram onStopRoutine;
AvmProgram onIEnableRoutine;
AvmProgram onEnableRoutine;
AvmProgram onIDisableRoutine;
AvmProgram onDisableRoutine;
AvmProgram onIAbortRoutine;
AvmProgram onAbortRoutine;
AvmProgram onIRunRoutine;
AvmProgram onRunRoutine;
AvmProgram onRtcRoutine;
AvmProgram onScheduleRoutine;
AvmProgram onConcurrencyRoutine;
AvmProgram onSynchronizeRoutine;
// Structural decompositon
bool mMainComponentFlag;
// MOC Attribute for mutable Schedule
bool mMutableScheduleFlag;
// Communication routing
TableOfRouter mTableOfRouter4Instance;
TableOfRouter mTableOfRouter4Model;
bool mRdvCommunicationFlag;
// MOC Attribute for Communication
bool mInputEnabledCommunicationFlag;
////////////////////////////////////////////////////////////////////////////
// Static Analysis Information
////////////////////////////////////////////////////////////////////////////
TableOfInstanceOfData mRequiredData;
TableOfInstanceOfData mUselessData;
// The list of backward reachable machine
ListOfInstanceOfMachine mBackwardReachableMachine;
// The list of backward reachable transition
ListOfAvmTransition mBackwardReachableTransition;
// The list of forward reachable machine
ListOfInstanceOfMachine mForwardReachableMachine;
// The list of forward reachable transition
ListOfAvmTransition mForwardReachableTransition;
// Default is << true >>
bool isReachableStateFlag;
public:
/**
* CONSTRUCTOR
* Default
*/
ExecutableForm(ExecutableSystem & aExecutableSystem,
ExecutableForm * aContainer,
Machine * astMachine, avm_size_t aDataSize = 0)
: AvmProgram(CLASS_KIND_T( ExecutableForm ),
Specifier::SCOPE_MACHINE_KIND, aContainer, astMachine, aDataSize),
SpecifierImpl( astMachine ),
mExecutableSystem( aExecutableSystem ),
mInitialInstanceCount(
((astMachine != NULL) && astMachine->hasInstanceSpecifier()) ?
astMachine->getInstanceSpecifier()->getInitialInstanceCount() : 1 ),
mMaximalInstanceCount(
((astMachine != NULL) && astMachine->hasInstanceSpecifier()) ?
astMachine->getInstanceSpecifier()->getMaximalInstanceCount() : 1 ),
mPossibleStaticInstanciationCount( 0 ),
mPossibleDynamicInstanciationCount( 0 ),
mTableOfChannel( ),
mTableOfPort( ),
mMessageSignalCount( 0 ),
mTableOfBuffer( ),
mTableOfConnect( ),
mTableOfInstanceModel( ),
mTableOfInstanceStatic( ),
mPrototypeInstance( ),
mTableOfInstanceDynamic( ),
mTableOfTransition( ),
mTableOfProgram( ),
mTableOfAnonymousInnerRoutine( ),
mTableOfExecutable( ),
mTableOfAlias( ),
onCreateRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "create" , 0 ),
onInitRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "init" , 0 ),
onFinalRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "final" , 0 ),
onReturnRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "return" , 0 ),
onStartRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "start" , 0 ),
onStopRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "stop" , 0 ),
onIEnableRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "ienable" , 0 ),
onEnableRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "enable" , 0 ),
onIDisableRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "idisable" , 0 ),
onDisableRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "disable" , 0 ),
onIAbortRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "iabort" , 0 ),
onAbortRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "abort" , 0 ),
onIRunRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "irun" , 0 ),
onRunRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "run" , 0 ),
onRtcRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "rtc" , 0 ),
onScheduleRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "schedule" , 0 ),
onConcurrencyRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "concurrency" , 0 ),
onSynchronizeRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "synchronize" , 0 ),
mMainComponentFlag( ( (astMachine == NULL) ||
astMachine->getModifier().hasFeatureTransient() ) ? false : true ),
mMutableScheduleFlag( false ),
mTableOfRouter4Instance( ),
mTableOfRouter4Model( ),
mRdvCommunicationFlag( false ),
mInputEnabledCommunicationFlag( false ),
mRequiredData( ),
mUselessData( ),
mBackwardReachableMachine( ),
mBackwardReachableTransition( ),
mForwardReachableMachine( ),
mForwardReachableTransition( ),
isReachableStateFlag( true )
{
updateFullyQualifiedNameID();
}
ExecutableForm(ExecutableSystem & aExecutableSystem, avm_size_t aDataSize)
: AvmProgram(CLASS_KIND_T( ExecutableForm ),
Specifier::SCOPE_MACHINE_KIND, NULL, NULL, aDataSize),
SpecifierImpl( Specifier::COMPONENT_EXECUTABLE_SPECIFIER ),
mExecutableSystem( aExecutableSystem ),
mInitialInstanceCount( 1 ),
mMaximalInstanceCount( 1 ),
mPossibleStaticInstanciationCount( 0 ),
mPossibleDynamicInstanciationCount( 0 ),
mTableOfChannel( ),
mTableOfPort( ),
mMessageSignalCount( 0 ),
mTableOfBuffer( ),
mTableOfConnect( ),
mTableOfInstanceModel( ),
mTableOfInstanceStatic( ),
mPrototypeInstance( ),
mTableOfInstanceDynamic( ),
mTableOfTransition( ),
mTableOfProgram( ),
mTableOfAnonymousInnerRoutine( ),
mTableOfExecutable( ),
mTableOfAlias( ),
onCreateRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "create" , 0 ),
onInitRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "init" , 0 ),
onFinalRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "final" , 0 ),
onReturnRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "return" , 0 ),
onStartRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "start" , 0 ),
onStopRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "stop" , 0 ),
onIEnableRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "ienable" , 0 ),
onEnableRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "enable" , 0 ),
onIDisableRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "idisable" , 0 ),
onDisableRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "disable" , 0 ),
onIAbortRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "iabort" , 0 ),
onAbortRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "abort" , 0 ),
onIRunRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "irun" , 0 ),
onRunRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "run" , 0 ),
onRtcRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "rtc" , 0 ),
onScheduleRoutine ( Specifier::SCOPE_ROUTINE_KIND , this , "schedule" , 0 ),
onConcurrencyRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "concurrency" , 0 ),
onSynchronizeRoutine( Specifier::SCOPE_ROUTINE_KIND , this , "synchronize" , 0 ),
mMainComponentFlag( false ),
mMutableScheduleFlag( false ),
mTableOfRouter4Instance( ),
mTableOfRouter4Model( ),
mRdvCommunicationFlag( false ),
mInputEnabledCommunicationFlag( false ),
mRequiredData( ),
mUselessData( ),
mBackwardReachableMachine( ),
mBackwardReachableTransition( ),
mForwardReachableMachine( ),
mForwardReachableTransition( ),
isReachableStateFlag( true )
{
updateFullyQualifiedNameID();
}
/**
* DESTRUCTOR
*/
virtual ~ExecutableForm()
{
mRequiredData.clear();
mUselessData.clear();
}
/**
* GETTER - SETTER
* is in SCOPE
*/
inline bool isAncestorOf(const ExecutableForm * anExecutable)
{
while( (anExecutable != NULL) && (anExecutable != this) )
{
anExecutable = anExecutable->getExecutableContainer();
}
return( anExecutable == this );
}
/**
* SETTER
* mFullyQualifiedNameID
*/
virtual void updateFullyQualifiedNameID(
const std::string & aFullyQualifiedNameID);
inline virtual void updateFullyQualifiedNameID()
{
if( hasAstElement() )
{
updateFullyQualifiedNameID( getAstFullyQualifiedNameID() );
}
else
{
setAllNameID( "exec#anonym" , "exec#anonym" );
}
}
/**
* LCA -LCRA
*/
const ExecutableForm * LCA(
const ExecutableForm * anExecutable) const;
inline const ExecutableForm * LCRA(
const ExecutableForm * anExecutable) const
{
return( (this == anExecutable) ? this : LCA( anExecutable ) );
}
/**
* GETTER
* Compiled ObjectElement as Compiled Machine
*/
inline const Machine * getAstMachine() const
{
return( getAstElement()->as< Machine >() );
}
inline bool isAstMachine() const
{
return( hasAstElement() && getAstElement()->is< Machine >() );
}
inline const System * getAstSystem() const
{
return( getAstElement()->as< System >() );
}
inline bool isCompiledSystem() const
{
return( hasAstElement() && getAstElement()->is< System >() );
}
/**
* Primitive inlining
*/
bool isInlinableEnable() const
{
return( hasAstElement() && getAstElement()->is< Machine >() &&
getAstMachine()->isInlinableEnable() );
}
bool isInlinableProcedure() const
{
return( hasAstElement() && getAstElement()->is< Machine >() &&
getAstMachine()->isInlinableProcedure() );
}
/**
* GETTER - SETTER
* mInitialInstanceCount
*/
inline avm_size_t getInitialInstanceCount() const
{
return( mInitialInstanceCount );
}
inline bool hasInitialInstance() const
{
return( mInitialInstanceCount > 0 );
}
inline void setInitialInstanceCount(avm_size_t anInitialInstanceCount)
{
mInitialInstanceCount = anInitialInstanceCount;
}
/**
* GETTER - SETTER
* mMaximalInstanceCount
*/
inline avm_size_t getMaximalInstanceCount() const
{
return( mMaximalInstanceCount );
}
inline bool hasMaximalInstance() const
{
return( mMaximalInstanceCount != AVM_NUMERIC_MAX_SIZE_T );
}
inline bool hasMaximalNewInstance() const
{
return( (mMaximalInstanceCount > mInitialInstanceCount) &&
(mMaximalInstanceCount != AVM_NUMERIC_MAX_SIZE_T) );
}
inline void setMaximalInstanceCount(avm_size_t aMaximalInstanceCount)
{
mMaximalInstanceCount = aMaximalInstanceCount;
}
/**
* SETTER
* mInitialInstanceCount
* mMaximalInstanceCount
*/
inline void setInstanceCount(avm_size_t anInitialInstanceCount,
avm_size_t aMaximalInstanceCount)
{
mInitialInstanceCount = anInitialInstanceCount;
mMaximalInstanceCount = aMaximalInstanceCount;
}
inline avm_size_t getCreatedInstanceCount() const
{
return( mInitialInstanceCount );
// return( (mMaximalInstanceCount != AVM_NUMERIC_MAX_SIZE_T) ?
// mMaximalInstanceCount : mInitialInstanceCount );
}
/*
* GETTER - SETTER
* mPossibleStaticInstanciationCount
* mPossibleDynamicInstanciationCount
* Single or Multiple
* Instanciation Information
* for Data Access optimisation
*/
inline avm_size_t getPossibleStaticInstanciationCount() const
{
return( mPossibleStaticInstanciationCount );
}
inline bool hasPossibleStaticInstanciation() const
{
return( mPossibleStaticInstanciationCount > 0 );
}
void incrPossibleStaticInstanciationCount(avm_offset_t offset = 1);
inline avm_size_t getPossibleDynamicInstanciationCount() const
{
return( mPossibleDynamicInstanciationCount );
}
inline bool hasPossibleDynamicInstanciation() const
{
return( mPossibleDynamicInstanciationCount > 0 );
}
void incrPossibleDynamicInstanciationCount(avm_size_t offset = 1);
bool hasSingleRuntimeInstance();
/**
* GETTER - SETTER
* mTableOfChannel
*/
inline const Symbol & saveChannel(InstanceOfPort * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfPort !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfChannel.save(anInstance) );
}
inline TableOfSymbol & getChannel()
{
return( mTableOfChannel );
}
inline const TableOfSymbol & getChannel() const
{
return( mTableOfChannel );
}
inline bool hasChannel() const
{
return( mTableOfChannel.nonempty() );
}
/**
* GETTER - SETTER
* mTableOfPort
*/
inline const Symbol & savePort(InstanceOfPort * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfPort !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfPort.save(anInstance) );
}
inline TableOfSymbol & getPort()
{
return( mTableOfPort );
}
inline const TableOfSymbol & getPort() const
{
return( mTableOfPort );
}
inline bool hasPort() const
{
return( mTableOfPort.nonempty() );
}
/**
* GETTER - SETTER
* mMessageSignalCount
*/
inline avm_size_t getMessageSignalCount() const
{
return( mMessageSignalCount );
}
inline bool hasMessageSignalCount() const
{
return( mMessageSignalCount > 0 );
}
inline void setMessageSignalCount(avm_size_t count)
{
mMessageSignalCount = count;
}
/**
* GETTER - SETTER
* mTableOfBuffer
*/
inline const Symbol & saveBuffer(InstanceOfBuffer * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "BaseInstanceForm !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfBuffer.save(anInstance) );
}
inline TableOfSymbol & getBuffer()
{
return( mTableOfBuffer );
}
inline const TableOfSymbol & getBuffer() const
{
return( mTableOfBuffer );
}
inline bool hasBuffer() const
{
return( mTableOfBuffer.nonempty() );
}
/**
* GETTER - SETTER
* mTableOfConnect
*/
inline const Symbol & saveConnect(InstanceOfConnect * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "BaseInstanceForm !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfConnect.save(anInstance) );
}
inline TableOfSymbol & getConnect()
{
return( mTableOfConnect );
}
inline const TableOfSymbol & getConnect() const
{
return( mTableOfConnect );
}
inline bool hasConnect() const
{
return( mTableOfConnect.nonempty() );
}
/**
* GETTER
* Communicated or Lifeline
*/
inline bool isCommunicator() const
{
return( hasPort() || hasRouter4This() || hasConnect() );
}
inline bool isCommunicatorWith(InstanceOfPort * aPort) const
{
return( mTableOfPort.contains(aPort)
|| (hasRouter4This() && getRouter4This().hasRouting(aPort)) );
}
inline bool isLifeline() const
{
return( getSpecifier().hasFeatureLifeline() );
}
/**
* GETTER - SETTER
* mDefault instance for using machine model
*/
inline const Symbol & saveInstanceModel(InstanceOfMachine * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfMachine !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfInstanceModel.save( anInstance ) );
}
inline void appendInstanceModel(Symbol & aMachine)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( aMachine )
<< "InstanceOfMachine !!!"
<< SEND_EXIT;
aMachine.setContainer(this);
mTableOfInstanceModel.append( aMachine );
}
inline TableOfSymbol & getInstanceModel()
{
return( mTableOfInstanceModel );
}
inline const TableOfSymbol & getInstanceModel() const
{
return( mTableOfInstanceModel );
}
inline const Symbol & getByAstInstanceModel(
const ObjectElement * astElement) const
{
const Symbol & aModel =
mTableOfInstanceModel.getByAstElement(astElement);
// To ignore the THIS instance at offset 0 !!!
return( ( aModel.invalid() || aModel.isnotThis(this) ) ?
aModel : Symbol::REF_NULL );
}
inline bool hasInstanceModel() const
{
return( mTableOfInstanceModel.nonempty() );
}
inline bool hasInstanceModelThis() const
{
return( mTableOfInstanceModel.nonempty() &&
mTableOfInstanceModel.first().isThis() );
}
inline const Symbol & firstInstanceModel() const
{
return( hasInstanceModelThis() ?
mTableOfInstanceModel.second() :
mTableOfInstanceModel.first() );
}
inline bool hasOneInstanceModel() const
{
return( hasInstanceStaticThis()
&& (mTableOfInstanceModel.size() == 2) );
}
inline avm_size_t sizeInstanceModel() const
{
// don't forget the instance THIS at offset 0 !!!
return( mTableOfInstanceModel.size()
- (hasInstanceStaticThis() ? 1 : 0) );
}
/**
* GETTER
* begin -- end
* iterator
*/
inline TableOfSymbol::const_iterator instance_model_begin() const
{
// don't forget the instance THIS at offset 0 !!!
return( hasInstanceStaticThis() ?
++(mTableOfInstanceModel.begin()) :
mTableOfInstanceModel.begin() );
}
inline TableOfSymbol::const_iterator instance_model_end() const
{
return( mTableOfInstanceModel.end() );
}
/**
* GETTER - SETTER
* mTableOfInstanceStatic
*/
inline const Symbol & saveInstanceStatic(InstanceOfMachine * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfMachine !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfInstanceStatic.save(anInstance) );
}
inline TableOfSymbol & getInstanceStatic()
{
return( mTableOfInstanceStatic );
}
inline const TableOfSymbol & getInstanceStatic() const
{
return( mTableOfInstanceStatic );
}
inline const Symbol & getByAstInstanceStatic(
const ObjectElement * astElement) const
{
const Symbol & anInstance =
mTableOfInstanceStatic.getByAstElement(astElement);
// To ignore the THIS instance at offset 0 !!!
return( ( anInstance.invalid() || anInstance.isnotThis(this) ) ?
anInstance : Symbol::REF_NULL );
}
inline bool hasInstanceStatic() const
{
return( mTableOfInstanceStatic.nonempty() );
}
inline bool hasInstanceStaticThis() const
{
return( mTableOfInstanceStatic.nonempty() &&
mTableOfInstanceStatic.first().isThis() );
}
inline const Symbol & getInstanceStaticThis() const
{
return( mTableOfInstanceStatic.first() );
}
inline const Symbol & firstInstanceStatic() const
{
return( hasInstanceStaticThis() ?
mTableOfInstanceStatic.second() :
mTableOfInstanceStatic.first() );
}
inline bool hasOneInstanceStatic() const
{
return( hasInstanceStaticThis()
&& (mTableOfInstanceStatic.size() == 2) );
}
inline avm_size_t sizeInstanceStatic() const
{
// don't forget the instance THIS at offset 0 !!!
return( mTableOfInstanceStatic.size()
- (hasInstanceStaticThis() ? 1 : 0) );
}
/**
* GETTER
* begin -- end
* iterator
*/
inline TableOfSymbol::const_iterator instance_static_begin() const
{
// don't forget the instance THIS at offset 0 !!!
return( hasInstanceStaticThis() ?
++(mTableOfInstanceStatic.begin()) :
mTableOfInstanceStatic.begin() );
}
inline TableOfSymbol::const_iterator instance_static_end() const
{
return( mTableOfInstanceStatic.end() );
}
/**
* GETTER - SETTER
* Machine Count
*/
avm_size_t getrecMachineCount() const;
/**
* GETTER
* mPrototypeInstance
*/
inline InstanceOfMachine * getPrototypeInstance() const
{
return( mPrototypeInstance );
}
inline bool hasPrototypeInstance() const
{
return( mPrototypeInstance != NULL );
}
inline void setPrototypeInstance(InstanceOfMachine * anInstance)
{
mPrototypeInstance = anInstance;
}
/**
* GETTER - SETTER
* mTableOfInstanceStatic
* mTableOfInstanceModel
* mTableOfInstanceDynamic
*/
inline TableOfSymbol & getInstanceByDesign(Specifier::DESIGN_KIND aDesign)
{
switch( aDesign )
{
case Specifier::DESIGN_INSTANCE_KIND:
return( mTableOfInstanceStatic );
case Specifier::DESIGN_MODEL_KIND:
return( mTableOfInstanceModel );
case Specifier::DESIGN_DYNAMIC_KIND:
return( mTableOfInstanceDynamic );
default:
{
AVM_OS_FATAL_ERROR_EXIT
<< "Unexpected instance design << "
<< Specifier::strDesign(aDesign, "") << " >> !!!"
<< SEND_EXIT;
return( mTableOfInstanceStatic );
}
}
}
/**
* GETTER - SETTER
* mDefault instance for using machine model
*/
inline const Symbol & saveInstanceDynamic(InstanceOfMachine * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfMachine !!!"
<< SEND_EXIT;
anInstance->setContainer(this);
return( mTableOfInstanceDynamic.save( anInstance ) );
}
inline void appendInstanceDynamic(Symbol & aMachine)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( aMachine )
<< "InstanceOfMachine !!!"
<< SEND_EXIT;
aMachine.setContainer(this);
mTableOfInstanceDynamic.append( aMachine );
}
inline TableOfSymbol & getInstanceDynamic()
{
return( mTableOfInstanceDynamic );
}
inline const TableOfSymbol & getInstanceDynamic() const
{
return( mTableOfInstanceDynamic );
}
inline const Symbol & getByAstInstanceDynamic(
const ObjectElement * astElement) const
{
return( mTableOfInstanceDynamic.getByAstElement(astElement) );
}
inline bool hasInstanceDynamic() const
{
return( mTableOfInstanceDynamic.nonempty() );
}
/**
* GETTER
* begin -- end
* iterator
*/
inline TableOfSymbol::const_iterator instance_dynamic_begin() const
{
// don't forget the instance THIS at offset 0 !!!
return( mTableOfInstanceDynamic.begin() );
}
inline TableOfSymbol::const_iterator instance_dynamic_end() const
{
return( mTableOfInstanceDynamic.end() );
}
/**
* GETTER - SETTER
* mTableOfTransition
*/
inline const BF & saveTransition(AvmTransition * aTransition)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( aTransition )
<< "AvmTransition !!!"
<< SEND_EXIT;
aTransition->setContainer(this);
aTransition->setOffset( mTableOfTransition.size() );
return( mTableOfTransition.save(aTransition) );
}
inline TableOfTransition & getTransition()
{
return( mTableOfTransition );
}
inline const TableOfTransition & getTransition() const
{
return( mTableOfTransition );
}
inline AvmTransition * rawTransition(avm_offset_t offset) const
{
return( mTableOfTransition.rawAt(offset) );
}
inline const BF & getTransition(
const std::string & aFullyQualifiedNameID) const
{
return( mTableOfTransition.getByFQNameID( aFullyQualifiedNameID ) );
}
inline const BF & getTransitionByNameID(const std::string & aNameID) const
{
return( mTableOfTransition.getByNameID( aNameID ) );
}
inline const BF & getTransitionByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
return( mTableOfTransition.getByQualifiedNameID( aQualifiedNameID ) );
}
inline const BF & getTransitionByAstElement(
const ObjectElement * astElement) const
{
return( mTableOfTransition.getByAstElement(astElement) );
}
inline bool hasTransition() const
{
return( mTableOfTransition.nonempty() );
}
/**
* GETTER - SETTER
* mTableOfProgram
*/
inline void appendProgram(const BF & anAvmProgram)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( anAvmProgram )
<< "AvmProgram !!!"
<< SEND_EXIT;
anAvmProgram.to_ptr< AvmProgram >()->setContainer(this);
anAvmProgram.to_ptr< AvmProgram >()->setOffset( mTableOfProgram.size() );
mTableOfProgram.append(anAvmProgram);
}
inline const BF & saveProgram(AvmProgram * anAvmProgram)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anAvmProgram )
<< "AvmProgram !!!"
<< SEND_EXIT;
anAvmProgram->setContainer(this);
anAvmProgram->setOffset( mTableOfProgram.size() );
return( mTableOfProgram.save(anAvmProgram) );
}
inline TableOfAvmProgram & getProgram()
{
return( mTableOfProgram );
}
inline const TableOfAvmProgram & getProgram() const
{
return( mTableOfProgram );
}
inline AvmProgram * rawProgram(avm_offset_t offset) const
{
return( mTableOfProgram.rawAt(offset) );
}
inline const BF & getProgram(const std::string & aFullyQualifiedNameID,
Specifier::SCOPE_KIND aScope =
Specifier::SCOPE_UNDEFINED_KIND) const
{
return( mTableOfProgram.getByFQNameID(aFullyQualifiedNameID, aScope) );
}
inline const BF & getProgramByNameID(const std::string & id,
Specifier::SCOPE_KIND aScope =
Specifier::SCOPE_UNDEFINED_KIND) const
{
return( mTableOfProgram.getByNameID(id, aScope) );
}
inline const BF & getProgramByQualifiedNameID(
const std::string & aQualifiedNameID,
Specifier::SCOPE_KIND aScope =
Specifier::SCOPE_UNDEFINED_KIND) const
{
return( mTableOfProgram.
getByQualifiedNameID(aQualifiedNameID, aScope) );
}
inline const BF & getProgramByAstElement(
const ObjectElement * astElement) const
{
return( mTableOfProgram.getByAstElement(astElement) );
}
inline bool hasProgram() const
{
return( mTableOfProgram.nonempty() );
}
/**
* GETTER - SETTER
* mTableOfAnonymousInnerRoutine
* like << variable::on_write >> or << type::constraint >> routines
*/
inline const BF & saveAnonymousInnerRoutine(AvmProgram * aRoutine)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( aRoutine )
<< "Anonymous Inner Routine as Program !!!"
<< SEND_EXIT;
aRoutine->setContainer(this);
aRoutine->setOffset( mTableOfAnonymousInnerRoutine.size() );
return( mTableOfAnonymousInnerRoutine.save(aRoutine) );
}
/**
* GETTER - SETTER
* mTableOfExecutable
*/
inline const BF & saveExecutable(ExecutableForm * anExecutable)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anExecutable )
<< "ExecutableForm !!!"
<< SEND_EXIT;
anExecutable->setContainer(this);
anExecutable->setOffset( mTableOfExecutable.size() );
return( mTableOfExecutable.save(anExecutable) );
}
inline const TableOfExecutableForm & getExecutables() const
{
return( mTableOfExecutable );
}
inline bool hasExecutable() const
{
return( mTableOfExecutable.nonempty() );
}
/*
* contains DATA
*/
inline bool containsData(InstanceOfData * anInstance) const
{
return( AvmProgram::containsData(anInstance) /*||
mTableOfAlias.contains(anInstance)*/ );
}
/**
* GETTER - SETTER
* mTableOfAlias
*/
inline void appendAlias(const Symbol & anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT( anInstance )
<< "InstanceOfData !!!"
<< SEND_EXIT;
mTableOfAlias.append(anInstance);
}
inline const Symbol & saveAlias(BaseInstanceForm * anInstance)
{
AVM_OS_ASSERT_FATAL_NULL_POINTER_EXIT( anInstance )
<< "InstanceOfData !!!"
<< SEND_EXIT;
return( mTableOfAlias.save(anInstance) );
}
inline TableOfSymbol & getAlias()
{
return( mTableOfAlias );
}
inline const TableOfSymbol & getAlias() const
{
return( mTableOfAlias );
}
inline bool hasAlias() const
{
return( mTableOfAlias.nonempty() );
}
/**
* 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 & getSymbolByAstElement(const ObjectElement * astElement,
avm_type_specifier_kind_t typeFamily) const;
/**
* GETTER - SETTER
* onCreateRoutine
*/
inline AvmProgram & getOnCreateRoutine()
{
return( onCreateRoutine );
}
inline BFCode & getOnCreate()
{
return( onCreateRoutine.getCode() );
}
inline const BFCode & getOnCreate() const
{
return( onCreateRoutine.getCode() );
}
inline bool hasOnCreate() const
{
return( onCreateRoutine.hasCode() );
}
inline void setOnCreate(const BFCode & aProgram)
{
onCreateRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onInitRoutine
*/
inline AvmProgram & getOnInitRoutine()
{
return( onInitRoutine );
}
inline BFCode & getOnInit()
{
return( onInitRoutine.getCode() );
}
inline const BFCode & getOnInit() const
{
return( onInitRoutine.getCode() );
}
inline bool hasOnInit() const
{
return( onInitRoutine.hasCode() );
}
inline void setOnInit(const BFCode & aProgram)
{
onInitRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onFinalRoutine
*/
inline AvmProgram & getOnFinalRoutine()
{
return( onFinalRoutine );
}
inline BFCode & getOnFinal()
{
return( onFinalRoutine.getCode() );
}
inline const BFCode & getOnFinal() const
{
return( onFinalRoutine.getCode() );
}
inline bool hasOnFinal() const
{
return( onFinalRoutine.hasCode() );
}
inline void setOnFinal(const BFCode & aProgram)
{
onFinalRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onReturnRoutine
*/
inline AvmProgram & getOnReturnRoutine()
{
return( onReturnRoutine );
}
inline BFCode & getOnReturn()
{
return( onReturnRoutine.getCode() );
}
inline const BFCode & getOnReturn() const
{
return( onReturnRoutine.getCode() );
}
inline bool hasOnReturn() const
{
return( onReturnRoutine.hasCode() );
}
inline void setOnReturn(const BFCode & aProgram)
{
onReturnRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onStartRoutine
*/
inline AvmProgram & getOnStartRoutine()
{
return( onStartRoutine );
}
inline BFCode & getOnStart()
{
return( onStartRoutine.getCode() );
}
inline const BFCode & getOnStart() const
{
return( onStartRoutine.getCode() );
}
inline bool hasOnStart() const
{
return( onStartRoutine.hasCode() );
}
inline void setOnStart(const BFCode & aProgram)
{
onStartRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onStopRoutine
*/
inline AvmProgram & getOnStopRoutine()
{
return( onStopRoutine );
}
inline BFCode & getOnStop()
{
return( onStopRoutine.getCode() );
}
inline const BFCode & getOnStop() const
{
return( onStopRoutine.getCode() );
}
inline bool hasOnStop() const
{
return( onStopRoutine.hasCode() );
}
inline void setOnStop(const BFCode & aProgram)
{
onStopRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onIEnableRoutine
*/
inline AvmProgram & getOnIEnableRoutine()
{
return( onIEnableRoutine );
}
inline BFCode & getOnIEnable()
{
return( onIEnableRoutine.getCode() );
}
inline const BFCode & getOnIEnable() const
{
return( onIEnableRoutine.getCode() );
}
inline bool hasOnIEnable() const
{
return( onIEnableRoutine.hasCode() );
}
inline void setOnIEnable(const BFCode & aProgram)
{
onIEnableRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onEnableRoutine
*/
inline AvmProgram & getOnEnableRoutine()
{
return( onEnableRoutine );
}
inline BFCode & getOnEnable()
{
return( onEnableRoutine.getCode() );
}
inline const BFCode & getOnEnable() const
{
return( onEnableRoutine.getCode() );
}
inline bool hasOnEnable() const
{
return( onEnableRoutine.hasCode() );
}
inline void setOnEnable(const BFCode & aProgram)
{
onEnableRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onIDisableRoutine
*/
inline AvmProgram & getOnIDisableRoutine()
{
return( onIDisableRoutine );
}
inline BFCode & getOnIDisable()
{
return( onIDisableRoutine.getCode() );
}
inline const BFCode & getOnIDisable() const
{
return( onIDisableRoutine.getCode() );
}
inline bool hasOnIDisable() const
{
return( onIDisableRoutine.hasCode() );
}
inline void setOnIDisable(const BFCode & aProgram)
{
onIDisableRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onDisableRoutine
*/
inline AvmProgram & getOnDisableRoutine()
{
return( onDisableRoutine );
}
inline BFCode & getOnDisable()
{
return( onDisableRoutine.getCode() );
}
inline const BFCode & getOnDisable() const
{
return( onDisableRoutine.getCode() );
}
inline bool hasOnDisable() const
{
return( onDisableRoutine.hasCode() );
}
inline void setOnDisable(const BFCode & aProgram)
{
onDisableRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onIAbortRoutine
*/
inline AvmProgram & getOnIAbortRoutine()
{
return( onIAbortRoutine );
}
inline BFCode & getOnIAbort()
{
return( onIAbortRoutine.getCode() );
}
inline const BFCode & getOnIAbort() const
{
return( onIAbortRoutine.getCode() );
}
inline bool hasOnIAbort() const
{
return( onIAbortRoutine.hasCode() );
}
inline void setOnIAbort(const BFCode & aProgram)
{
onIAbortRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onAbortRoutine
*/
inline AvmProgram & getOnAbortRoutine()
{
return( onAbortRoutine );
}
inline BFCode & getOnAbort()
{
return( onAbortRoutine.getCode() );
}
inline const BFCode & getOnAbort() const
{
return( onAbortRoutine.getCode() );
}
inline bool hasOnAbort() const
{
return( onAbortRoutine.hasCode() );
}
inline void setOnAbort(const BFCode & aProgram)
{
onAbortRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onIRunRoutine
*/
inline AvmProgram & getOnIRunRoutine()
{
return( onIRunRoutine );
}
inline BFCode & getOnIRun()
{
return( onIRunRoutine.getCode() );
}
inline const BFCode & getOnIRun() const
{
return( onIRunRoutine.getCode() );
}
inline bool hasOnIRun() const
{
return( onIRunRoutine.hasCode() );
}
inline void setOnIRun(const BFCode & aProgram)
{
onIRunRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onRunRoutine
*/
inline AvmProgram & getOnRunRoutine()
{
return( onRunRoutine );
}
inline BFCode & getOnRun()
{
return( onRunRoutine.getCode() );
}
inline const BFCode & getOnRun() const
{
return( onRunRoutine.getCode() );
}
inline bool hasOnRun() const
{
return( onRunRoutine.hasCode() );
}
inline void setOnRun(const BFCode & aProgram)
{
onRunRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* onRtcRoutine
*/
inline AvmProgram & getOnRtcRoutine()
{
return( onRtcRoutine );
}
inline BFCode & getOnRtc()
{
return( onRtcRoutine.getCode() );
}
inline const BFCode & getOnRtc() const
{
return( onRtcRoutine.getCode() );
}
inline bool hasOnRtc() const
{
return( onRtcRoutine.hasCode() );
}
inline void setOnRtc(const BFCode & aProgram)
{
onRtcRoutine.setCode( aProgram );
}
/**
* GETTER - SETTER
* mSchedule
*/
inline AvmProgram & getOnScheduleRoutine()
{
return( onScheduleRoutine );
}
inline BFCode & getOnSchedule()
{
return( onScheduleRoutine.getCode() );
}
inline const BFCode & getOnSchedule() const
{
return( onScheduleRoutine.getCode() );
}
inline bool hasOnSchedule() const
{
return( onScheduleRoutine.hasCode() );
}
inline void setOnSchedule(const BFCode & aProgram)
{
onScheduleRoutine.setCode( aProgram );
}
inline bool hasUserRunningCode() const
{
return( hasOnRun() || hasOnRtc() || hasOnSchedule() );
}
/**
* GETTER
* mInitRoutine
* mEnableRoutine
* mRunRoutine
*/
inline bool hasInitOrRun() const
{
return( hasOnInit() || hasOnRun() );
}
inline bool hasOnInitOrEnableOrRun() const
{
return( hasOnInit() || hasOnEnable() || hasOnRun() );
}
/**
* GETTER
* on activity by opcode
*/
AvmProgram & getOnActivityRoutine(AVM_OPCODE opCode);
const BFCode & getOnActivity(AVM_OPCODE opCode) const;
/**
* GETTER - SETTER
* mComponentFlag
* Structural decompositon
*/
bool isMainComponent() const
{
return( mMainComponentFlag );
}
void setMainComponent(bool isMainComponent = true)
{
mMainComponentFlag = isMainComponent;
}
bool isCompositeComponent() const
{
return( hasOnConcurrency() );
}
/**
* GETTER - SETTER
* mMutableScheduleFlag
* MOC Attribute for mutable Schedule
*/
bool isMutableSchedule() const
{
return( mMutableScheduleFlag );
}
void setMutableSchedule(bool isMutableSchedule = true)
{
mMutableScheduleFlag = isMutableSchedule;
}
bool isInlinableSchedule() const;
/**
* GETTER - SETTER
* mConcurrency
*/
inline AvmProgram & getOnConcurrencyRoutine()
{
return( onConcurrencyRoutine );
}
inline BFCode & getOnConcurrency()
{
return( onConcurrencyRoutine.getCode() );
}
inline const BFCode & getOnConcurrency() const
{
return( onConcurrencyRoutine.getCode() );
}
inline bool hasOnConcurrency() const
{
return( onConcurrencyRoutine.hasCode() );
}
inline void setOnConcurrency(const BFCode & aProgram)
{
onConcurrencyRoutine.setCode( aProgram );
}
inline Operator * getOnConcurrencyOperator() const
{
AVM_OS_ASSERT_FATAL_NULL_SMART_POINTER_EXIT(
onConcurrencyRoutine.getCode() )
<< " Concurrency Operator for "
<< str_header( this ) << " !!!"
<< SEND_EXIT;
return( onConcurrencyRoutine.getCode()->getOperator() );
}
/**
* GETTER - SETTER
* mSynchronize
*/
inline AvmProgram & getOnSynchronizeRoutine()
{
return( onSynchronizeRoutine );
}
inline BFCode & getOnSynchronize()
{
return( onSynchronizeRoutine.getCode() );
}
inline const BFCode & getOnSynchronize() const
{
return( onSynchronizeRoutine.getCode() );
}
inline bool hasOnSynchronize() const
{
return( onSynchronizeRoutine.hasCode() );
}
inline void setOnSynchronize(const BFCode & aProgram)
{
onSynchronizeRoutine.setCode( aProgram );
}
/**
* GETTER
* the Schedulability property
*/
inline bool isSchedulable() const
{
return( hasOnInit() && hasOnRun() );
}
/**
* GETTER - SETTER
* mTableOfRouter4Instance
*/
inline TableOfRouter & getRouters4Instance()
{
return( mTableOfRouter4Instance );
}
inline const TableOfRouter & getRouters4Instance() const
{
return( mTableOfRouter4Instance );
}
inline bool hasRouter4Instance() const
{
return( mTableOfRouter4Instance.nonempty() );
}
inline void setRouters4Instance(const TableOfRouter & aRouterTable)
{
mTableOfRouter4Instance = aRouterTable;
}
inline void appendRouter4Instance(const Router & aRouter)
{
mTableOfRouter4Instance.append( aRouter );
}
inline Router & getRouter4Instance(avm_size_t offset)
{
AVM_OS_ASSERT_FATAL_ARRAY_INDEX_EXIT(
offset , mTableOfRouter4Instance.size() )
<< SEND_EXIT;
return( mTableOfRouter4Instance.get(offset) );
}
inline const Router & getRouter4Instance(avm_size_t offset) const
{
AVM_OS_ASSERT_FATAL_ARRAY_INDEX_EXIT(
offset , mTableOfRouter4Instance.size() )
<< SEND_EXIT;
return( mTableOfRouter4Instance.get(offset) );
}
inline Router & getRouter4This()
{
AVM_OS_ASSERT_FATAL_EMPTY_COLLECTION_EXIT( mTableOfRouter4Instance )
<< "Table of Router for Instance !!!"
<< SEND_EXIT;
AVM_OS_ASSERT_FATAL_ERROR_EXIT( hasInstanceStaticThis() )
<< "Unexpected an executable without machine< this > !!!"
<< SEND_EXIT;
return( mTableOfRouter4Instance.get(
getInstanceStaticThis().getOffset() ) );
}
inline const Router & getRouter4This() const
{
AVM_OS_ASSERT_FATAL_EMPTY_COLLECTION_EXIT( mTableOfRouter4Instance )
<< "Table of Router for Instance !!!"
<< SEND_EXIT;
AVM_OS_ASSERT_FATAL_ERROR_EXIT( hasInstanceStaticThis() )
<< "Unexpected an executable without machine< this > !!!"
<< SEND_EXIT;
return( mTableOfRouter4Instance.get(
getInstanceStaticThis().getOffset() ) );
}
inline bool hasRouter4This() const
{
return( mTableOfRouter4Instance.nonempty()
&& hasInstanceStaticThis()
&& mTableOfRouter4Instance.get(
getInstanceStaticThis().getOffset() ).valid() );
}
/**
* GETTER - SETTER
* mRouterTable4Prototype
*/
inline const Router & getRouter4Prototype(ExecutableForm * aModel) const
{
if( mTableOfRouter4Instance.nonempty() )
{
TableOfRouter::const_iterator it = mTableOfRouter4Instance.begin();
TableOfRouter::const_iterator endIt = mTableOfRouter4Instance.end();
for( ; it != endIt ; ++it )
{
if( (*it).valid()
&& ((*it).getMachine()->getExecutable() == aModel)
&& (*it).getMachine()->
getSpecifier().isDesignPrototypeStatic() )
{
return( *it );
}
}
}
return( Router::_NULL_ );
}
inline const Router & getRouter4Prototype(InstanceOfMachine * aMachine) const
{
return( getRouter4Prototype(aMachine->getExecutable()) );
}
/**
* GETTER - SETTER
* mTableOfRouter4Model
*/
inline TableOfRouter & getRouters4Model()
{
return( mTableOfRouter4Model );
}
inline const TableOfRouter & getRouters4Model() const
{
return( mTableOfRouter4Model );
}
inline bool hasRouter4Model() const
{
return( mTableOfRouter4Model.nonempty() );
}
inline void setRouters4Model(const TableOfRouter & aRouterTable)
{
mTableOfRouter4Model = aRouterTable;
}
inline void appendRouter4Model(const Router & aRouter)
{
mTableOfRouter4Model.append( aRouter );
}
inline Router & getRouter4Model(avm_size_t offset)
{
AVM_OS_ASSERT_FATAL_ARRAY_INDEX_EXIT(
offset , mTableOfRouter4Model.size() )
<< SEND_EXIT;
return( mTableOfRouter4Model.get(offset) );
}
inline const Router & getRouter4Model(avm_size_t offset) const
{
AVM_OS_ASSERT_FATAL_ARRAY_INDEX_EXIT(
offset , mTableOfRouter4Model.size() )
<< SEND_EXIT;
return( mTableOfRouter4Model.get(offset) );
}
inline const Router & getRouter4Model(const ExecutableForm * aModel) const
{
if( mTableOfRouter4Model.nonempty() )
{
TableOfRouter::const_iterator it = mTableOfRouter4Model.begin();
TableOfRouter::const_iterator endIt = mTableOfRouter4Model.end();
for( ; it != endIt ; ++it )
{
if( (*it).valid()
&& ((*it).getMachine()->getExecutable() == aModel) )
{
return( *it );
}
}
}
return( Router::_NULL_ );
}
inline const Router & getRouter4Model(
const InstanceOfMachine * aMachine) const
{
return( getRouter4Model(aMachine->getExecutable()) );
}
/**
* GETTER - SETTER
* mRdvCommunicationFlag
*/
inline bool hasRdvCommunication() const
{
return( mRdvCommunicationFlag );
}
void setRdvCommunication(bool aFlag = true)
{
mRdvCommunicationFlag = aFlag;
}
/**
* GETTER - SETTER
* mInputEnabledCommunicationFlag
* MOC Attribute for Communication
*/
bool isInputEnabledCommunication() const
{
return( mInputEnabledCommunicationFlag );
}
void setInputEnabledCommunication(bool isInputEnabled = true)
{
mInputEnabledCommunicationFlag = isInputEnabled;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// STATIC ANALYSIS ATTRIBUTE
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* GETTER - SETTER
* mRequiredData
*/
inline TableOfInstanceOfData & getRequiredData()
{
return( mRequiredData );
}
inline const TableOfInstanceOfData & getRequiredData() const
{
return( mRequiredData );
}
/**
* GETTER - SETTER
* mUselessData
*/
inline TableOfInstanceOfData & getUselessData()
{
return( mUselessData );
}
inline const TableOfInstanceOfData & getUselessData() const
{
return( mUselessData );
}
/**
* Control flow analysis
* source & targets Executable< [state]machine > for Transition
*/
inline void getOutgoingMachine(ListOfInstanceOfMachine & listOfMachine)
{
for( avm_size_t offset = 0 ; offset < getTransition().size() ; ++offset )
{
getTransition().rawAt(offset)->getTransitionTarget( listOfMachine );
}
}
inline void getOutgoingTransition(ListOfAvmTransition & listOfTransition)
{
AvmTransition * aTransition;
for( avm_size_t offset = 0 ; offset < getTransition().size() ; ++offset )
{
aTransition = getTransition().rawAt(offset);
listOfTransition.append( aTransition );
}
}
/**
* GETTER - SETTER
* mListOfBackwardReachableMachine
*/
inline void addBackwardReachableMachine(InstanceOfMachine * aMachine)
{
mBackwardReachableMachine.add_union( aMachine );
}
inline void addBackwardReachableMachine(
ListOfInstanceOfMachine & reachableMachines)
{
mBackwardReachableMachine.add_union( reachableMachines );
}
inline ListOfInstanceOfMachine & getBackwardReachableMachine()
{
return( mBackwardReachableMachine );
}
inline const ListOfInstanceOfMachine & getBackwardReachableMachine() const
{
return( mBackwardReachableMachine );
}
bool containsBackwardReachableMachine(InstanceOfMachine * aMachine) const
{
return( mBackwardReachableMachine.contains(aMachine) );
}
inline bool hasBackwardReachableMachine() const
{
return( mBackwardReachableMachine.nonempty() );
}
inline void removeBackwardReachableMachine(InstanceOfMachine * aMachine)
{
if( mBackwardReachableMachine.nonempty() )
{
mBackwardReachableMachine.remove( aMachine );
}
}
/**
* GETTER - SETTER
* mListOfBackwardReachableMachine
*/
inline void addBackwardReachableTransition(AvmTransition * aTransition)
{
mBackwardReachableTransition.add_union( aTransition );
}
inline void addBackwardReachableTransition(
ListOfAvmTransition & reachableTransitions)
{
mBackwardReachableTransition.add_union( reachableTransitions );
}
inline ListOfAvmTransition & getBackwardReachableTransition()
{
return( mBackwardReachableTransition );
}
inline const ListOfAvmTransition & getBackwardReachableTransition() const
{
return( mBackwardReachableTransition );
}
bool containsBackwardReachableTransition(AvmTransition * aTransition) const
{
return( mBackwardReachableTransition.contains(aTransition) );
}
inline bool hasBackwardReachableTransition() const
{
return( mBackwardReachableTransition.nonempty() );
}
inline void removeBackwardReachableTransition(AvmTransition * aTransition)
{
if( mBackwardReachableTransition.nonempty() )
{
mBackwardReachableTransition.remove( aTransition );
}
}
/**
* GETTER - SETTER
* mListOfForwardReachableMachine
*/
inline void addForwardReachableMachine(InstanceOfMachine * aMachine)
{
mForwardReachableMachine.add_union( aMachine );
}
inline void addForwardReachableMachine(
ListOfInstanceOfMachine & reachableMachines)
{
mForwardReachableMachine.add_union( reachableMachines );
}
inline ListOfInstanceOfMachine & getForwardReachableMachine()
{
return( mForwardReachableMachine );
}
inline const ListOfInstanceOfMachine & getForwardReachableMachine() const
{
return( mForwardReachableMachine );
}
bool containsForwardReachableMachine(InstanceOfMachine * aMachine) const
{
return( mForwardReachableMachine.contains(aMachine) );
}
inline bool hasForwardReachableMachine() const
{
return( mForwardReachableMachine.nonempty() );
}
inline void removeForwardReachableMachine(InstanceOfMachine * aMachine)
{
if( mForwardReachableMachine.nonempty() )
{
mForwardReachableMachine.remove( aMachine );
}
}
/**
* GETTER - SETTER
* mListOfForwardReachableMachine
*/
inline void addForwardReachableTransition(AvmTransition * aTransition)
{
mForwardReachableTransition.add_union( aTransition );
}
inline void addForwardReachableTransition(
ListOfAvmTransition & reachableTransitions)
{
mForwardReachableTransition.add_union( reachableTransitions );
}
inline ListOfAvmTransition & getForwardReachableTransition()
{
return( mForwardReachableTransition );
}
inline const ListOfAvmTransition & getForwardReachableTransition() const
{
return( mForwardReachableTransition );
}
bool containsForwardReachableTransition(AvmTransition * aTransition) const
{
return( mForwardReachableTransition.contains(aTransition) );
}
inline bool hasForwardReachableTransition() const
{
return( mForwardReachableTransition.nonempty() );
}
inline void removeForwardReachableTransition(AvmTransition * aTransition)
{
if( mForwardReachableTransition.nonempty() )
{
mForwardReachableTransition.remove( aTransition );
}
}
/**
* GETTER - SETTER
* isReachableStateFlag
*/
bool isReachableState()
{
return( isReachableStateFlag );
}
void setReachableState(bool aReachableStateFlag)
{
isReachableStateFlag = aReachableStateFlag;
}
/**
* Serialization
*/
void header(OutStream & os) const;
void strHeader(OutStream & os) const;
static void toStream(OutStream & os, const TableOfRouter & aTableOfRouter,
const std::string & sectionName = "router:");
void toStream(OutStream & os) const;
};
}
#endif /*EXECUTABLEFORM_H_*/