blob: 524bc2d45cbba2485f73849127803c6433ba05b3 [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
*
* Created on: 8 mars 2017
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#include "Machine.h"
#include <fml/infrastructure/BehavioralPart.h>
#include <fml/infrastructure/CompositePart.h>
#include <fml/infrastructure/PropertyPart.h>
namespace sep
{
/**
* GETTER for PARSER / COMPILER
* any Object Element
*/
const BF & MachineQuery::getPropertyByNameID(const std::string & aNameID) const
{
return( getPropertyPart().getPropertyByNameID(aNameID) );
}
const BF & MachineQuery::getrecFormByNameID(const std::string & aNameID) const
{
const BF & form = getPropertyByNameID(aNameID);
if( form.valid() )
{
return( form );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & form = (itMachine)->getPropertyByNameID(aNameID);
if( form.valid() )
{
return( form );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemFormByNameID(const std::string & aNameID) const
{
const Machine * machine = thisMachine();
const BF & form = machine->getPropertyByNameID(aNameID);
if( form.valid() )
{
return( form );
}
while( machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & form = machine->getPropertyByNameID(aNameID);
if( form.valid() )
{
return( form );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getPropertyByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
return( getPropertyPart().
getPropertyByQualifiedNameID(aQualifiedNameID) );
}
const BF & MachineQuery::getrecFormByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
const BF & form = getPropertyByQualifiedNameID(aQualifiedNameID);
if( form.valid() )
{
return( form );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & form =
(itMachine)->getPropertyByQualifiedNameID(aQualifiedNameID);
if( form.valid() )
{
return( form );
}
}
return( BF::REF_NULL );
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemFormByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & form = machine->getPropertyByQualifiedNameID(aQualifiedNameID);
if( form.valid() )
{
return( form );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & form =
machine->getPropertyByQualifiedNameID(aQualifiedNameID);
if( form.valid() )
{
return( form );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Variable
*/
const BF & MachineQuery::getVariable(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getVariable(aQualifiedNameID) );
}
const BF & MachineQuery::getrecVariable(
const std::string & aQualifiedNameID) const
{
const BF & var = getVariable(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecVariable(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemVariable(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getVariable(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getVariable(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/*
* TYPEDEF VARIABLE
* as ENUMERATION | STRUCTURE
*/
const BF & MachineQuery::getDataType(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getDataType(aQualifiedNameID) );
}
const BF & MachineQuery::getrecDataType(
const std::string & aQualifiedNameID) const
{
const BF & var = getDataType(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecDataType(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemDataType(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getDataType(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getDataType(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Buffer
*/
const BF & MachineQuery::getBuffer(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getBuffer(aQualifiedNameID) );
}
const BF & MachineQuery::getrecBuffer(const std::string & aQualifiedNameID) const
{
const BF & var = getBuffer(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecBuffer(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemBuffer(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getBuffer(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getBuffer(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Channel
*/
const BF & MachineQuery::getChannel(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getChannel(aQualifiedNameID) );
}
const BF & MachineQuery::getrecChannel(
const std::string & aQualifiedNameID) const
{
const BF & var = getChannel(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecChannel(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemChannel(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getChannel(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getChannel(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Port
*/
const BF & MachineQuery::getPort(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getPort(aQualifiedNameID) );
}
const BF & MachineQuery::getrecPort(const std::string & aQualifiedNameID) const
{
const BF & var = getPort(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecPort(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemPort(const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getPort(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getPort(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Signal
*/
const BF & MachineQuery::getSignal(const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getSignal(aQualifiedNameID) );
}
const BF & MachineQuery::getrecSignal(
const std::string & aQualifiedNameID) const
{
const BF & var = getSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemSignal(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
const BF & var = machine->getSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Port / Signal
*/
const BF & MachineQuery::getPortSignal(
const std::string & aQualifiedNameID) const
{
return( getPropertyPart().getPortSignal(aQualifiedNameID) );
}
const BF & MachineQuery::getrecPortSignal(
const std::string & aQualifiedNameID) const
{
{
const BF & var = getPortSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
const BF & var = (itMachine)->getrecPortSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
const BF & MachineQuery::getsemPortSignal(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
{
const BF & var = machine->getPortSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
while( machine->hasContainer()
&& machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
const BF & var = machine->getPortSignal(aQualifiedNameID);
if( var.valid() )
{
return( var );
}
}
return( BF::REF_NULL );
}
/**
* GETTER for PARSER / COMPILER
* Routine
*/
Routine * MachineQuery::rawRoutineByNameID(const std::string & aNameID) const
{
return( (not hasBehaviorPart()) ? NULL :
getBehaviorPart()->rawRoutineByNameID(aNameID) );
}
Routine * MachineQuery::rawsemRoutineByNameID(const std::string & aNameID) const
{
const Machine * machine = thisMachine();
Routine * routine = machine->rawRoutineByNameID(aNameID);
while( (routine == NULL) && machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
routine = machine->rawRoutineByNameID(aNameID);
}
return( routine );
}
/**
* GETTER for PARSER / COMPILER
* Procedure
*/
Machine * MachineQuery::rawProcedureByNameID(const std::string & aNameID) const
{
return( (getCompositePart() == NULL) ? NULL :
getCompositePart()->rawProcedureByNameID(aNameID) );
}
Machine * MachineQuery::rawsemProcedureByNameID(
const std::string & aNameID) const
{
const Machine * machine = thisMachine();
Machine * procedure = machine->rawProcedureByNameID(aNameID);
while( (procedure == NULL) && machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
procedure = machine->rawProcedureByNameID(aNameID);
}
return( procedure );
}
/**
* GETTER for PARSER / COMPILER
* Machine
*/
Machine * MachineQuery::getMachineByNameID(const std::string & aNameID) const
{
if( thisMachine()->getNameID() == aNameID )
{
return( const_cast< Machine * >( thisMachine() ) );
}
return( (getCompositePart() == NULL) ? NULL :
getCompositePart()->rawMachineByNameID(aNameID) );
}
Machine * MachineQuery::getsemMachineByNameID(const std::string & aNameID) const
{
Machine * machine = const_cast< Machine * >( thisMachine() );
Machine * sm = machine->getMachineByNameID(aNameID);
while( (sm == NULL) && machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
sm = machine->getMachineByNameID(aNameID);
}
return( sm );
}
Machine * MachineQuery::getMachine(
const std::string & aQualifiedNameID) const
{
Machine * machine = getCompositePart()->
getMachines().rawByQualifiedNameID(aQualifiedNameID);
if( machine != NULL )
{
return( machine );
}
if( thisMachine()->fqnEquals( aQualifiedNameID , false ) )
{
return( const_cast< Machine * >( thisMachine() ) );
}
return( machine );
}
Machine * MachineQuery::getrecMachine(const std::string & aQualifiedNameID,
Machine * ignoreChildMachine) const
{
Machine * machine = NULL;
if( (machine = getMachine(aQualifiedNameID)) != NULL )
{
return( machine );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
if( ((itMachine) != ignoreChildMachine) &&
((machine = (itMachine)->getrecMachine(aQualifiedNameID)) != NULL) )
{
return( machine );
}
}
return( machine );
}
Machine * MachineQuery::getsemMachine(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
Machine * sm = machine->getMachine(aQualifiedNameID);
while( (sm == NULL) && machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
sm = machine->getMachine(aQualifiedNameID);
}
return( sm );
}
Machine * MachineQuery::getsemMachine(
const std::vector< std::string > & aQualifiedNameID) const
{
std::vector< std::string >::const_iterator it = aQualifiedNameID.begin();
std::vector< std::string >::const_iterator endIt = aQualifiedNameID.end();
Machine * sm = thisMachine()->getsemMachineByNameID(*it);
for( ++it; (sm != NULL) && (it != endIt) ; ++it)
{
sm = sm->getMachineByNameID(*it);
}
return( sm );
}
Machine * MachineQuery::getExecutableMachine(
const std::string & aQualifiedNameID) const
{
Machine * machine = getCompositePart()->
rawExecutableMachineByQualifiedNameID(aQualifiedNameID);
if( machine != NULL )
{
return( machine );
}
return( machine );
}
Machine * MachineQuery::getrecExecutableMachine(
const std::string & aQualifiedNameID) const
{
Machine * machine = NULL;
if( (machine = getExecutableMachine(aQualifiedNameID)) != NULL )
{
return( machine );
}
CompositePart::const_machine_iterator itMachine =
getCompositePart()->machine_begin();
CompositePart::const_machine_iterator endMachine =
getCompositePart()->machine_end();
for( ; itMachine != endMachine ; ++itMachine )
{
if( (machine = (itMachine)->getrecExecutableMachine(aQualifiedNameID)) != NULL )
{
return( machine );
}
}
return( machine );
}
Machine * MachineQuery::getsemExecutableMachine(
const std::string & aQualifiedNameID) const
{
const Machine * machine = thisMachine();
Machine * sm = machine->getExecutableMachine(aQualifiedNameID);
while( (sm == NULL) && machine->hasContainer() &&
machine->getContainer()->is< Machine >() )
{
machine = machine->getContainer()->to< Machine >();
sm = machine->getExecutableMachine(aQualifiedNameID);
}
return( sm );
}
} /* namespace sep */