| /******************************************************************************* |
| * 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_*/ |