4 changed files with 133 additions and 49 deletions
			
			
		- 
					47src/storm/storage/jani/traverser/AssignmentsFinder.cpp
 - 
					29src/storm/storage/jani/traverser/AssignmentsFinder.h
 - 
					62src/storm/storage/jani/traverser/JaniTraverser.cpp
 - 
					36src/storm/storage/jani/traverser/JaniTraverser.h
 
@ -0,0 +1,47 @@ | 
				
			|||
#include "storm/storage/jani/traverser/AssignmentsFinder.h"
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace jani { | 
				
			|||
         | 
				
			|||
        AssignmentsFinder::ResultType AssignmentsFinder::find(Model const& model, Variable const& variable) { | 
				
			|||
            ResultType res; | 
				
			|||
            res.hasLocationAssignment = false; | 
				
			|||
            res.hasEdgeAssignment = false; | 
				
			|||
            res.hasEdgeDestinationAssignment = false; | 
				
			|||
            JaniTraverser::traverse(model, std::make_pair(&variable, &res)); | 
				
			|||
            return res; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void AssignmentsFinder::traverse(Location const& location, boost::any const& data) const { | 
				
			|||
            auto resVar = boost::any_cast<std::pair<Variable const*, ResultType*>>(data); | 
				
			|||
            for (auto const& assignment : location.getAssignments()) { | 
				
			|||
                if (assignment.getVariable() == *resVar.first) { | 
				
			|||
                    resVar.second->hasLocationAssignment = true; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            JaniTraverser::traverse(location, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void AssignmentsFinder::traverse(TemplateEdge const& templateEdge, boost::any const& data) const { | 
				
			|||
            auto resVar = boost::any_cast<std::pair<Variable const*, ResultType*>>(data); | 
				
			|||
            for (auto const& assignment : templateEdge.getAssignments()) { | 
				
			|||
                if (assignment.getVariable() == *resVar.first) { | 
				
			|||
                    resVar.second->hasEdgeAssignment = true; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            JaniTraverser::traverse(templateEdge, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void AssignmentsFinder::traverse(TemplateEdgeDestination const& templateEdgeDestination, boost::any const& data) const { | 
				
			|||
            auto resVar = boost::any_cast<std::pair<Variable const*, ResultType*>>(data); | 
				
			|||
            for (auto const& assignment : templateEdgeDestination.getOrderedAssignments()) { | 
				
			|||
                if (assignment.getVariable() == *resVar.first) { | 
				
			|||
                    resVar.second->hasEdgeDestinationAssignment = true; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            JaniTraverser::traverse(templateEdgeDestination, data); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
@ -0,0 +1,29 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
 | 
				
			|||
#include <boost/any.hpp> | 
				
			|||
 | 
				
			|||
#include "storm/storage/jani/traverser/JaniTraverser.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace jani { | 
				
			|||
        class AssignmentsFinder : public JaniTraverser { | 
				
			|||
        public: | 
				
			|||
             | 
				
			|||
            struct ResultType { | 
				
			|||
                bool hasLocationAssignment, hasEdgeAssignment, hasEdgeDestinationAssignment; | 
				
			|||
            }; | 
				
			|||
             | 
				
			|||
            AssignmentsFinder() = default; | 
				
			|||
             | 
				
			|||
            ResultType find(Model const& model, Variable const& variable); | 
				
			|||
             | 
				
			|||
            virtual ~AssignmentsFinder() = default; | 
				
			|||
             | 
				
			|||
            virtual void traverse(Location const& location, boost::any const& data) const override; | 
				
			|||
            virtual void traverse(TemplateEdge const& templateEdge, boost::any const& data) const override; | 
				
			|||
            virtual void traverse(TemplateEdgeDestination const& templateEdgeDestination, boost::any const& data) const override; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue