LCOV - code coverage report
Current view: top level - process/include/mcrl2/process - process_expression.h (source / functions) Hit Total Coverage
Test: mcrl2_coverage.info.cleaned Lines: 324 389 83.3 %
Date: 2024-04-26 03:18:02 Functions: 193 334 57.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Author(s): Wieger Wesselink
       2             : // Copyright: see the accompanying file COPYING or copy at
       3             : // https://github.com/mCRL2org/mCRL2/blob/master/COPYING
       4             : //
       5             : // Distributed under the Boost Software License, Version 1.0.
       6             : // (See accompanying file LICENSE_1_0.txt or copy at
       7             : // http://www.boost.org/LICENSE_1_0.txt)
       8             : //
       9             : /// \file mcrl2/process/process_expression.h
      10             : /// \brief add your file description here.
      11             : 
      12             : #ifndef MCRL2_PROCESS_PROCESS_EXPRESSION_H
      13             : #define MCRL2_PROCESS_PROCESS_EXPRESSION_H
      14             : 
      15             : #include "mcrl2/data/assignment.h"
      16             : #include "mcrl2/data/untyped_data_parameter.h"
      17             : #include "mcrl2/process/action_label.h"
      18             : #include "mcrl2/process/communication_expression.h"
      19             : #include "mcrl2/process/process_identifier.h"
      20             : #include "mcrl2/process/rename_expression.h"
      21             : 
      22             : namespace mcrl2
      23             : {
      24             : 
      25             : namespace process
      26             : {
      27             : 
      28             : //--- start generated classes ---//
      29             : /// \\brief A process expression
      30             : class process_expression: public atermpp::aterm_appl
      31             : {
      32             :   public:
      33             :     /// \\brief Default constructor.
      34       79063 :     process_expression()
      35       79063 :       : atermpp::aterm_appl(core::detail::default_values::ProcExpr)
      36       79063 :     {}
      37             : 
      38             :     /// \\brief Constructor.
      39             :     /// \\param term A term
      40      746823 :     explicit process_expression(const atermpp::aterm& term)
      41      746823 :       : atermpp::aterm_appl(term)
      42             :     {
      43      746823 :       assert(core::detail::check_rule_ProcExpr(*this));
      44      746823 :     }
      45             : 
      46             :     /// \\brief Constructor.
      47        5013 :     process_expression(const data::untyped_data_parameter& x)
      48        5013 :       : atermpp::aterm_appl(x)
      49        5013 :     {}
      50             : 
      51             :     /// Move semantics
      52      477478 :     process_expression(const process_expression&) noexcept = default;
      53       91264 :     process_expression(process_expression&&) noexcept = default;
      54       58232 :     process_expression& operator=(const process_expression&) noexcept = default;
      55       33031 :     process_expression& operator=(process_expression&&) noexcept = default;
      56             : };
      57             : 
      58             : /// \\brief list of process_expressions
      59             : typedef atermpp::term_list<process_expression> process_expression_list;
      60             : 
      61             : /// \\brief vector of process_expressions
      62             : typedef std::vector<process_expression>    process_expression_vector;
      63             : 
      64             : // prototypes
      65             : inline bool is_action(const atermpp::aterm_appl& x);
      66             : inline bool is_process_instance(const atermpp::aterm_appl& x);
      67             : inline bool is_process_instance_assignment(const atermpp::aterm_appl& x);
      68             : inline bool is_delta(const atermpp::aterm_appl& x);
      69             : inline bool is_tau(const atermpp::aterm_appl& x);
      70             : inline bool is_sum(const atermpp::aterm_appl& x);
      71             : inline bool is_block(const atermpp::aterm_appl& x);
      72             : inline bool is_hide(const atermpp::aterm_appl& x);
      73             : inline bool is_rename(const atermpp::aterm_appl& x);
      74             : inline bool is_comm(const atermpp::aterm_appl& x);
      75             : inline bool is_allow(const atermpp::aterm_appl& x);
      76             : inline bool is_sync(const atermpp::aterm_appl& x);
      77             : inline bool is_at(const atermpp::aterm_appl& x);
      78             : inline bool is_seq(const atermpp::aterm_appl& x);
      79             : inline bool is_if_then(const atermpp::aterm_appl& x);
      80             : inline bool is_if_then_else(const atermpp::aterm_appl& x);
      81             : inline bool is_bounded_init(const atermpp::aterm_appl& x);
      82             : inline bool is_merge(const atermpp::aterm_appl& x);
      83             : inline bool is_left_merge(const atermpp::aterm_appl& x);
      84             : inline bool is_choice(const atermpp::aterm_appl& x);
      85             : inline bool is_stochastic_operator(const atermpp::aterm_appl& x);
      86             : inline bool is_untyped_process_assignment(const atermpp::aterm_appl& x);
      87             : 
      88             : /// \\brief Test for a process_expression expression
      89             : /// \\param x A term
      90             : /// \\return True if \\a x is a process_expression expression
      91             : inline
      92             : bool is_process_expression(const atermpp::aterm_appl& x)
      93             : {
      94             :   return data::is_untyped_data_parameter(x) ||
      95             :          process::is_action(x) ||
      96             :          process::is_process_instance(x) ||
      97             :          process::is_process_instance_assignment(x) ||
      98             :          process::is_delta(x) ||
      99             :          process::is_tau(x) ||
     100             :          process::is_sum(x) ||
     101             :          process::is_block(x) ||
     102             :          process::is_hide(x) ||
     103             :          process::is_rename(x) ||
     104             :          process::is_comm(x) ||
     105             :          process::is_allow(x) ||
     106             :          process::is_sync(x) ||
     107             :          process::is_at(x) ||
     108             :          process::is_seq(x) ||
     109             :          process::is_if_then(x) ||
     110             :          process::is_if_then_else(x) ||
     111             :          process::is_bounded_init(x) ||
     112             :          process::is_merge(x) ||
     113             :          process::is_left_merge(x) ||
     114             :          process::is_choice(x) ||
     115             :          process::is_stochastic_operator(x) ||
     116             :          process::is_untyped_process_assignment(x);
     117             : }
     118             : 
     119             : // prototype declaration
     120             : std::string pp(const process_expression& x);
     121             : 
     122             : /// \\brief Outputs the object to a stream
     123             : /// \\param out An output stream
     124             : /// \\param x Object x
     125             : /// \\return The output stream
     126             : inline
     127           3 : std::ostream& operator<<(std::ostream& out, const process_expression& x)
     128             : {
     129           3 :   return out << process::pp(x);
     130             : }
     131             : 
     132             : /// \\brief swap overload
     133             : inline void swap(process_expression& t1, process_expression& t2)
     134             : {
     135             :   t1.swap(t2);
     136             : }
     137             : 
     138             : 
     139             : /// \\brief An action
     140             : class action: public process_expression
     141             : {
     142             :   public:
     143             :     /// \\brief Default constructor.
     144       55211 :     action()
     145       55211 :       : process_expression(core::detail::default_values::Action)
     146       55211 :     {}
     147             : 
     148             :     /// \\brief Constructor.
     149             :     /// \\param term A term
     150       36442 :     explicit action(const atermpp::aterm& term)
     151       36442 :       : process_expression(term)
     152             :     {
     153       36442 :       assert(core::detail::check_term_Action(*this));
     154       36442 :     }
     155             : 
     156             :     /// \\brief Constructor.
     157       15727 :     action(const action_label& label, const data::data_expression_list& arguments)
     158       15727 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Action(), label, arguments))
     159       15727 :     {}
     160             : 
     161             :     /// Move semantics
     162      409133 :     action(const action&) noexcept = default;
     163          63 :     action(action&&) noexcept = default;
     164           6 :     action& operator=(const action&) noexcept = default;
     165         964 :     action& operator=(action&&) noexcept = default;
     166             : 
     167      448463 :     const action_label& label() const
     168             :     {
     169      448463 :       return atermpp::down_cast<action_label>((*this)[0]);
     170             :     }
     171             : 
     172      170312 :     const data::data_expression_list& arguments() const
     173             :     {
     174      170312 :       return atermpp::down_cast<data::data_expression_list>((*this)[1]);
     175             :     }
     176             : };
     177             : 
     178             : /// \\brief Make_action constructs a new term into a given address.
     179             : /// \\ \param t The reference into which the new action is constructed. 
     180             : template <class... ARGUMENTS>
     181       19210 : inline void make_action(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     182             : {
     183       19210 :   atermpp::make_term_appl(t, core::detail::function_symbol_Action(), args...);
     184       19210 : }
     185             : 
     186             : /// \\brief list of actions
     187             : typedef atermpp::term_list<action> action_list;
     188             : 
     189             : /// \\brief vector of actions
     190             : typedef std::vector<action>    action_vector;
     191             : 
     192             : /// \\brief Test for a action expression
     193             : /// \\param x A term
     194             : /// \\return True if \\a x is a action expression
     195             : inline
     196      148349 : bool is_action(const atermpp::aterm_appl& x)
     197             : {
     198      148349 :   return x.function() == core::detail::function_symbols::Action;
     199             : }
     200             : 
     201             : // prototype declaration
     202             : std::string pp(const action& x);
     203             : 
     204             : /// \\brief Outputs the object to a stream
     205             : /// \\param out An output stream
     206             : /// \\param x Object x
     207             : /// \\return The output stream
     208             : inline
     209           0 : std::ostream& operator<<(std::ostream& out, const action& x)
     210             : {
     211           0 :   return out << process::pp(x);
     212             : }
     213             : 
     214             : /// \\brief swap overload
     215          14 : inline void swap(action& t1, action& t2)
     216             : {
     217          14 :   t1.swap(t2);
     218          14 : }
     219             : 
     220             : 
     221             : /// \\brief A process
     222             : class process_instance: public process_expression
     223             : {
     224             :   public:
     225             :     /// \\brief Default constructor.
     226             :     process_instance()
     227             :       : process_expression(core::detail::default_values::Process)
     228             :     {}
     229             : 
     230             :     /// \\brief Constructor.
     231             :     /// \\param term A term
     232        9550 :     explicit process_instance(const atermpp::aterm& term)
     233        9550 :       : process_expression(term)
     234             :     {
     235        9550 :       assert(core::detail::check_term_Process(*this));
     236        9550 :     }
     237             : 
     238             :     /// \\brief Constructor.
     239        2445 :     process_instance(const process_identifier& identifier, const data::data_expression_list& actual_parameters)
     240        2445 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Process(), identifier, actual_parameters))
     241        2445 :     {}
     242             : 
     243             :     /// Move semantics
     244           1 :     process_instance(const process_instance&) noexcept = default;
     245           2 :     process_instance(process_instance&&) noexcept = default;
     246             :     process_instance& operator=(const process_instance&) noexcept = default;
     247             :     process_instance& operator=(process_instance&&) noexcept = default;
     248             : 
     249       13758 :     const process_identifier& identifier() const
     250             :     {
     251       13758 :       return atermpp::down_cast<process_identifier>((*this)[0]);
     252             :     }
     253             : 
     254        8362 :     const data::data_expression_list& actual_parameters() const
     255             :     {
     256        8362 :       return atermpp::down_cast<data::data_expression_list>((*this)[1]);
     257             :     }
     258             : };
     259             : 
     260             : /// \\brief Make_process_instance constructs a new term into a given address.
     261             : /// \\ \param t The reference into which the new process_instance is constructed. 
     262             : template <class... ARGUMENTS>
     263        2138 : inline void make_process_instance(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     264             : {
     265        2138 :   atermpp::make_term_appl(t, core::detail::function_symbol_Process(), args...);
     266        2138 : }
     267             : 
     268             : /// \\brief Test for a process_instance expression
     269             : /// \\param x A term
     270             : /// \\return True if \\a x is a process_instance expression
     271             : inline
     272       54821 : bool is_process_instance(const atermpp::aterm_appl& x)
     273             : {
     274       54821 :   return x.function() == core::detail::function_symbols::Process;
     275             : }
     276             : 
     277             : // prototype declaration
     278             : std::string pp(const process_instance& x);
     279             : 
     280             : /// \\brief Outputs the object to a stream
     281             : /// \\param out An output stream
     282             : /// \\param x Object x
     283             : /// \\return The output stream
     284             : inline
     285           0 : std::ostream& operator<<(std::ostream& out, const process_instance& x)
     286             : {
     287           0 :   return out << process::pp(x);
     288             : }
     289             : 
     290             : /// \\brief swap overload
     291             : inline void swap(process_instance& t1, process_instance& t2)
     292             : {
     293             :   t1.swap(t2);
     294             : }
     295             : 
     296             : 
     297             : /// \\brief A process assignment
     298             : class process_instance_assignment: public process_expression
     299             : {
     300             :   public:
     301             :     /// \\brief Default constructor.
     302             :     process_instance_assignment()
     303             :       : process_expression(core::detail::default_values::ProcessAssignment)
     304             :     {}
     305             : 
     306             :     /// \\brief Constructor.
     307             :     /// \\param term A term
     308       65192 :     explicit process_instance_assignment(const atermpp::aterm& term)
     309       65192 :       : process_expression(term)
     310             :     {
     311       65192 :       assert(core::detail::check_term_ProcessAssignment(*this));
     312       65192 :     }
     313             : 
     314             :     /// \\brief Constructor.
     315       15077 :     process_instance_assignment(const process_identifier& identifier, const data::assignment_list& assignments)
     316       15077 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_ProcessAssignment(), identifier, assignments))
     317       15077 :     {}
     318             : 
     319             :     /// Move semantics
     320        8039 :     process_instance_assignment(const process_instance_assignment&) noexcept = default;
     321         442 :     process_instance_assignment(process_instance_assignment&&) noexcept = default;
     322             :     process_instance_assignment& operator=(const process_instance_assignment&) noexcept = default;
     323             :     process_instance_assignment& operator=(process_instance_assignment&&) noexcept = default;
     324             : 
     325       74233 :     const process_identifier& identifier() const
     326             :     {
     327       74233 :       return atermpp::down_cast<process_identifier>((*this)[0]);
     328             :     }
     329             : 
     330       28096 :     const data::assignment_list& assignments() const
     331             :     {
     332       28096 :       return atermpp::down_cast<data::assignment_list>((*this)[1]);
     333             :     }
     334             : };
     335             : 
     336             : /// \\brief Make_process_instance_assignment constructs a new term into a given address.
     337             : /// \\ \param t The reference into which the new process_instance_assignment is constructed. 
     338             : template <class... ARGUMENTS>
     339        1039 : inline void make_process_instance_assignment(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     340             : {
     341        1039 :   atermpp::make_term_appl(t, core::detail::function_symbol_ProcessAssignment(), args...);
     342        1039 : }
     343             : 
     344             : /// \\brief Test for a process_instance_assignment expression
     345             : /// \\param x A term
     346             : /// \\return True if \\a x is a process_instance_assignment expression
     347             : inline
     348      187527 : bool is_process_instance_assignment(const atermpp::aterm_appl& x)
     349             : {
     350      187527 :   return x.function() == core::detail::function_symbols::ProcessAssignment;
     351             : }
     352             : 
     353             : // prototype declaration
     354             : std::string pp(const process_instance_assignment& x);
     355             : 
     356             : /// \\brief Outputs the object to a stream
     357             : /// \\param out An output stream
     358             : /// \\param x Object x
     359             : /// \\return The output stream
     360             : inline
     361             : std::ostream& operator<<(std::ostream& out, const process_instance_assignment& x)
     362             : {
     363             :   return out << process::pp(x);
     364             : }
     365             : 
     366             : /// \\brief swap overload
     367             : inline void swap(process_instance_assignment& t1, process_instance_assignment& t2)
     368             : {
     369             :   t1.swap(t2);
     370             : }
     371             : 
     372             : 
     373             : /// \\brief The value delta
     374             : class delta: public process_expression
     375             : {
     376             :   public:
     377             :     /// \\brief Default constructor.
     378       13402 :     delta()
     379       13402 :       : process_expression(core::detail::default_values::Delta)
     380       13402 :     {}
     381             : 
     382             :     /// \\brief Constructor.
     383             :     /// \\param term A term
     384        2490 :     explicit delta(const atermpp::aterm& term)
     385        2490 :       : process_expression(term)
     386             :     {
     387        2490 :       assert(core::detail::check_term_Delta(*this));
     388        2490 :     }
     389             : 
     390             :     /// Move semantics
     391             :     delta(const delta&) noexcept = default;
     392             :     delta(delta&&) noexcept = default;
     393             :     delta& operator=(const delta&) noexcept = default;
     394             :     delta& operator=(delta&&) noexcept = default;
     395             : };
     396             : 
     397             : /// \\brief Test for a delta expression
     398             : /// \\param x A term
     399             : /// \\return True if \\a x is a delta expression
     400             : inline
     401       61136 : bool is_delta(const atermpp::aterm_appl& x)
     402             : {
     403       61136 :   return x.function() == core::detail::function_symbols::Delta;
     404             : }
     405             : 
     406             : // prototype declaration
     407             : std::string pp(const delta& x);
     408             : 
     409             : /// \\brief Outputs the object to a stream
     410             : /// \\param out An output stream
     411             : /// \\param x Object x
     412             : /// \\return The output stream
     413             : inline
     414             : std::ostream& operator<<(std::ostream& out, const delta& x)
     415             : {
     416             :   return out << process::pp(x);
     417             : }
     418             : 
     419             : /// \\brief swap overload
     420             : inline void swap(delta& t1, delta& t2)
     421             : {
     422             :   t1.swap(t2);
     423             : }
     424             : 
     425             : 
     426             : /// \\brief The value tau
     427             : class tau: public process_expression
     428             : {
     429             :   public:
     430             :     /// \\brief Default constructor.
     431        9196 :     tau()
     432        9196 :       : process_expression(core::detail::default_values::Tau)
     433        9196 :     {}
     434             : 
     435             :     /// \\brief Constructor.
     436             :     /// \\param term A term
     437         784 :     explicit tau(const atermpp::aterm& term)
     438         784 :       : process_expression(term)
     439             :     {
     440         784 :       assert(core::detail::check_term_Tau(*this));
     441         784 :     }
     442             : 
     443             :     /// Move semantics
     444             :     tau(const tau&) noexcept = default;
     445             :     tau(tau&&) noexcept = default;
     446             :     tau& operator=(const tau&) noexcept = default;
     447             :     tau& operator=(tau&&) noexcept = default;
     448             : };
     449             : 
     450             : /// \\brief Test for a tau expression
     451             : /// \\param x A term
     452             : /// \\return True if \\a x is a tau expression
     453             : inline
     454       59332 : bool is_tau(const atermpp::aterm_appl& x)
     455             : {
     456       59332 :   return x.function() == core::detail::function_symbols::Tau;
     457             : }
     458             : 
     459             : // prototype declaration
     460             : std::string pp(const tau& x);
     461             : 
     462             : /// \\brief Outputs the object to a stream
     463             : /// \\param out An output stream
     464             : /// \\param x Object x
     465             : /// \\return The output stream
     466             : inline
     467             : std::ostream& operator<<(std::ostream& out, const tau& x)
     468             : {
     469             :   return out << process::pp(x);
     470             : }
     471             : 
     472             : /// \\brief swap overload
     473             : inline void swap(tau& t1, tau& t2)
     474             : {
     475             :   t1.swap(t2);
     476             : }
     477             : 
     478             : 
     479             : /// \\brief The sum operator
     480             : class sum: public process_expression
     481             : {
     482             :   public:
     483             :     /// \\brief Default constructor.
     484             :     sum()
     485             :       : process_expression(core::detail::default_values::Sum)
     486             :     {}
     487             : 
     488             :     /// \\brief Constructor.
     489             :     /// \\param term A term
     490       16804 :     explicit sum(const atermpp::aterm& term)
     491       16804 :       : process_expression(term)
     492             :     {
     493       16804 :       assert(core::detail::check_term_Sum(*this));
     494       16804 :     }
     495             : 
     496             :     /// \\brief Constructor.
     497        4159 :     sum(const data::variable_list& variables, const process_expression& operand)
     498        4159 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Sum(), variables, operand))
     499        4159 :     {}
     500             : 
     501             :     /// Move semantics
     502             :     sum(const sum&) noexcept = default;
     503             :     sum(sum&&) noexcept = default;
     504             :     sum& operator=(const sum&) noexcept = default;
     505             :     sum& operator=(sum&&) noexcept = default;
     506             : 
     507        9730 :     const data::variable_list& variables() const
     508             :     {
     509        9730 :       return atermpp::down_cast<data::variable_list>((*this)[0]);
     510             :     }
     511             : 
     512       12147 :     const process_expression& operand() const
     513             :     {
     514       12147 :       return atermpp::down_cast<process_expression>((*this)[1]);
     515             :     }
     516             : };
     517             : 
     518             : /// \\brief Make_sum constructs a new term into a given address.
     519             : /// \\ \param t The reference into which the new sum is constructed. 
     520             : template <class... ARGUMENTS>
     521        1865 : inline void make_sum(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     522             : {
     523        1865 :   atermpp::make_term_appl(t, core::detail::function_symbol_Sum(), args...);
     524        1865 : }
     525             : 
     526             : /// \\brief Test for a sum expression
     527             : /// \\param x A term
     528             : /// \\return True if \\a x is a sum expression
     529             : inline
     530      148363 : bool is_sum(const atermpp::aterm_appl& x)
     531             : {
     532      148363 :   return x.function() == core::detail::function_symbols::Sum;
     533             : }
     534             : 
     535             : // prototype declaration
     536             : std::string pp(const sum& x);
     537             : 
     538             : /// \\brief Outputs the object to a stream
     539             : /// \\param out An output stream
     540             : /// \\param x Object x
     541             : /// \\return The output stream
     542             : inline
     543             : std::ostream& operator<<(std::ostream& out, const sum& x)
     544             : {
     545             :   return out << process::pp(x);
     546             : }
     547             : 
     548             : /// \\brief swap overload
     549             : inline void swap(sum& t1, sum& t2)
     550             : {
     551             :   t1.swap(t2);
     552             : }
     553             : 
     554             : 
     555             : /// \\brief The block operator
     556             : class block: public process_expression
     557             : {
     558             :   public:
     559             :     /// \\brief Default constructor.
     560             :     block()
     561             :       : process_expression(core::detail::default_values::Block)
     562             :     {}
     563             : 
     564             :     /// \\brief Constructor.
     565             :     /// \\param term A term
     566           0 :     explicit block(const atermpp::aterm& term)
     567           0 :       : process_expression(term)
     568             :     {
     569           0 :       assert(core::detail::check_term_Block(*this));
     570           0 :     }
     571             : 
     572             :     /// \\brief Constructor.
     573           0 :     block(const core::identifier_string_list& block_set, const process_expression& operand)
     574           0 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Block(), block_set, operand))
     575           0 :     {}
     576             : 
     577             :     /// Move semantics
     578             :     block(const block&) noexcept = default;
     579             :     block(block&&) noexcept = default;
     580             :     block& operator=(const block&) noexcept = default;
     581             :     block& operator=(block&&) noexcept = default;
     582             : 
     583           0 :     const core::identifier_string_list& block_set() const
     584             :     {
     585           0 :       return atermpp::down_cast<core::identifier_string_list>((*this)[0]);
     586             :     }
     587             : 
     588           0 :     const process_expression& operand() const
     589             :     {
     590           0 :       return atermpp::down_cast<process_expression>((*this)[1]);
     591             :     }
     592             : };
     593             : 
     594             : /// \\brief Make_block constructs a new term into a given address.
     595             : /// \\ \param t The reference into which the new block is constructed. 
     596             : template <class... ARGUMENTS>
     597           0 : inline void make_block(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     598             : {
     599           0 :   atermpp::make_term_appl(t, core::detail::function_symbol_Block(), args...);
     600           0 : }
     601             : 
     602             : /// \\brief Test for a block expression
     603             : /// \\param x A term
     604             : /// \\return True if \\a x is a block expression
     605             : inline
     606       82409 : bool is_block(const atermpp::aterm_appl& x)
     607             : {
     608       82409 :   return x.function() == core::detail::function_symbols::Block;
     609             : }
     610             : 
     611             : // prototype declaration
     612             : std::string pp(const block& x);
     613             : 
     614             : /// \\brief Outputs the object to a stream
     615             : /// \\param out An output stream
     616             : /// \\param x Object x
     617             : /// \\return The output stream
     618             : inline
     619             : std::ostream& operator<<(std::ostream& out, const block& x)
     620             : {
     621             :   return out << process::pp(x);
     622             : }
     623             : 
     624             : /// \\brief swap overload
     625             : inline void swap(block& t1, block& t2)
     626             : {
     627             :   t1.swap(t2);
     628             : }
     629             : 
     630             : 
     631             : /// \\brief The hide operator
     632             : class hide: public process_expression
     633             : {
     634             :   public:
     635             :     /// \\brief Default constructor.
     636             :     hide()
     637             :       : process_expression(core::detail::default_values::Hide)
     638             :     {}
     639             : 
     640             :     /// \\brief Constructor.
     641             :     /// \\param term A term
     642         444 :     explicit hide(const atermpp::aterm& term)
     643         444 :       : process_expression(term)
     644             :     {
     645         444 :       assert(core::detail::check_term_Hide(*this));
     646         444 :     }
     647             : 
     648             :     /// \\brief Constructor.
     649          96 :     hide(const core::identifier_string_list& hide_set, const process_expression& operand)
     650          96 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Hide(), hide_set, operand))
     651          96 :     {}
     652             : 
     653             :     /// Move semantics
     654             :     hide(const hide&) noexcept = default;
     655             :     hide(hide&&) noexcept = default;
     656             :     hide& operator=(const hide&) noexcept = default;
     657             :     hide& operator=(hide&&) noexcept = default;
     658             : 
     659         240 :     const core::identifier_string_list& hide_set() const
     660             :     {
     661         240 :       return atermpp::down_cast<core::identifier_string_list>((*this)[0]);
     662             :     }
     663             : 
     664         348 :     const process_expression& operand() const
     665             :     {
     666         348 :       return atermpp::down_cast<process_expression>((*this)[1]);
     667             :     }
     668             : };
     669             : 
     670             : /// \\brief Make_hide constructs a new term into a given address.
     671             : /// \\ \param t The reference into which the new hide is constructed. 
     672             : template <class... ARGUMENTS>
     673          72 : inline void make_hide(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     674             : {
     675          72 :   atermpp::make_term_appl(t, core::detail::function_symbol_Hide(), args...);
     676          72 : }
     677             : 
     678             : /// \\brief Test for a hide expression
     679             : /// \\param x A term
     680             : /// \\return True if \\a x is a hide expression
     681             : inline
     682       83271 : bool is_hide(const atermpp::aterm_appl& x)
     683             : {
     684       83271 :   return x.function() == core::detail::function_symbols::Hide;
     685             : }
     686             : 
     687             : // prototype declaration
     688             : std::string pp(const hide& x);
     689             : 
     690             : /// \\brief Outputs the object to a stream
     691             : /// \\param out An output stream
     692             : /// \\param x Object x
     693             : /// \\return The output stream
     694             : inline
     695             : std::ostream& operator<<(std::ostream& out, const hide& x)
     696             : {
     697             :   return out << process::pp(x);
     698             : }
     699             : 
     700             : /// \\brief swap overload
     701             : inline void swap(hide& t1, hide& t2)
     702             : {
     703             :   t1.swap(t2);
     704             : }
     705             : 
     706             : 
     707             : /// \\brief The rename operator
     708             : class rename: public process_expression
     709             : {
     710             :   public:
     711             :     /// \\brief Default constructor.
     712             :     rename()
     713             :       : process_expression(core::detail::default_values::Rename)
     714             :     {}
     715             : 
     716             :     /// \\brief Constructor.
     717             :     /// \\param term A term
     718           0 :     explicit rename(const atermpp::aterm& term)
     719           0 :       : process_expression(term)
     720             :     {
     721           0 :       assert(core::detail::check_term_Rename(*this));
     722           0 :     }
     723             : 
     724             :     /// \\brief Constructor.
     725           0 :     rename(const rename_expression_list& rename_set, const process_expression& operand)
     726           0 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Rename(), rename_set, operand))
     727           0 :     {}
     728             : 
     729             :     /// Move semantics
     730             :     rename(const rename&) noexcept = default;
     731             :     rename(rename&&) noexcept = default;
     732             :     rename& operator=(const rename&) noexcept = default;
     733             :     rename& operator=(rename&&) noexcept = default;
     734             : 
     735           0 :     const rename_expression_list& rename_set() const
     736             :     {
     737           0 :       return atermpp::down_cast<rename_expression_list>((*this)[0]);
     738             :     }
     739             : 
     740           0 :     const process_expression& operand() const
     741             :     {
     742           0 :       return atermpp::down_cast<process_expression>((*this)[1]);
     743             :     }
     744             : };
     745             : 
     746             : /// \\brief Make_rename constructs a new term into a given address.
     747             : /// \\ \param t The reference into which the new rename is constructed. 
     748             : template <class... ARGUMENTS>
     749           0 : inline void make_rename(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     750             : {
     751           0 :   atermpp::make_term_appl(t, core::detail::function_symbol_Rename(), args...);
     752           0 : }
     753             : 
     754             : /// \\brief Test for a rename expression
     755             : /// \\param x A term
     756             : /// \\return True if \\a x is a rename expression
     757             : inline
     758       82856 : bool is_rename(const atermpp::aterm_appl& x)
     759             : {
     760       82856 :   return x.function() == core::detail::function_symbols::Rename;
     761             : }
     762             : 
     763             : // prototype declaration
     764             : std::string pp(const rename& x);
     765             : 
     766             : /// \\brief Outputs the object to a stream
     767             : /// \\param out An output stream
     768             : /// \\param x Object x
     769             : /// \\return The output stream
     770             : inline
     771             : std::ostream& operator<<(std::ostream& out, const rename& x)
     772             : {
     773             :   return out << process::pp(x);
     774             : }
     775             : 
     776             : /// \\brief swap overload
     777             : inline void swap(rename& t1, rename& t2)
     778             : {
     779             :   t1.swap(t2);
     780             : }
     781             : 
     782             : 
     783             : /// \\brief The communication operator
     784             : class comm: public process_expression
     785             : {
     786             :   public:
     787             :     /// \\brief Default constructor.
     788             :     comm()
     789             :       : process_expression(core::detail::default_values::Comm)
     790             :     {}
     791             : 
     792             :     /// \\brief Constructor.
     793             :     /// \\param term A term
     794        2207 :     explicit comm(const atermpp::aterm& term)
     795        2207 :       : process_expression(term)
     796             :     {
     797        2207 :       assert(core::detail::check_term_Comm(*this));
     798        2207 :     }
     799             : 
     800             :     /// \\brief Constructor.
     801         485 :     comm(const communication_expression_list& comm_set, const process_expression& operand)
     802         485 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Comm(), comm_set, operand))
     803         485 :     {}
     804             : 
     805             :     /// Move semantics
     806             :     comm(const comm&) noexcept = default;
     807             :     comm(comm&&) noexcept = default;
     808             :     comm& operator=(const comm&) noexcept = default;
     809             :     comm& operator=(comm&&) noexcept = default;
     810             : 
     811        1338 :     const communication_expression_list& comm_set() const
     812             :     {
     813        1338 :       return atermpp::down_cast<communication_expression_list>((*this)[0]);
     814             :     }
     815             : 
     816        1723 :     const process_expression& operand() const
     817             :     {
     818        1723 :       return atermpp::down_cast<process_expression>((*this)[1]);
     819             :     }
     820             : };
     821             : 
     822             : /// \\brief Make_comm constructs a new term into a given address.
     823             : /// \\ \param t The reference into which the new comm is constructed. 
     824             : template <class... ARGUMENTS>
     825         366 : inline void make_comm(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     826             : {
     827         366 :   atermpp::make_term_appl(t, core::detail::function_symbol_Comm(), args...);
     828         366 : }
     829             : 
     830             : /// \\brief Test for a comm expression
     831             : /// \\param x A term
     832             : /// \\return True if \\a x is a comm expression
     833             : inline
     834       92892 : bool is_comm(const atermpp::aterm_appl& x)
     835             : {
     836       92892 :   return x.function() == core::detail::function_symbols::Comm;
     837             : }
     838             : 
     839             : // prototype declaration
     840             : std::string pp(const comm& x);
     841             : 
     842             : /// \\brief Outputs the object to a stream
     843             : /// \\param out An output stream
     844             : /// \\param x Object x
     845             : /// \\return The output stream
     846             : inline
     847             : std::ostream& operator<<(std::ostream& out, const comm& x)
     848             : {
     849             :   return out << process::pp(x);
     850             : }
     851             : 
     852             : /// \\brief swap overload
     853             : inline void swap(comm& t1, comm& t2)
     854             : {
     855             :   t1.swap(t2);
     856             : }
     857             : 
     858             : 
     859             : /// \\brief The allow operator
     860             : class allow: public process_expression
     861             : {
     862             :   public:
     863             :     /// \\brief Default constructor.
     864             :     allow()
     865             :       : process_expression(core::detail::default_values::Allow)
     866             :     {}
     867             : 
     868             :     /// \\brief Constructor.
     869             :     /// \\param term A term
     870        1256 :     explicit allow(const atermpp::aterm& term)
     871        1256 :       : process_expression(term)
     872             :     {
     873        1256 :       assert(core::detail::check_term_Allow(*this));
     874        1256 :     }
     875             : 
     876             :     /// \\brief Constructor.
     877         273 :     allow(const action_name_multiset_list& allow_set, const process_expression& operand)
     878         273 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Allow(), allow_set, operand))
     879         273 :     {}
     880             : 
     881             :     /// Move semantics
     882             :     allow(const allow&) noexcept = default;
     883             :     allow(allow&&) noexcept = default;
     884             :     allow& operator=(const allow&) noexcept = default;
     885             :     allow& operator=(allow&&) noexcept = default;
     886             : 
     887         694 :     const action_name_multiset_list& allow_set() const
     888             :     {
     889         694 :       return atermpp::down_cast<action_name_multiset_list>((*this)[0]);
     890             :     }
     891             : 
     892         990 :     const process_expression& operand() const
     893             :     {
     894         990 :       return atermpp::down_cast<process_expression>((*this)[1]);
     895             :     }
     896             : };
     897             : 
     898             : /// \\brief Make_allow constructs a new term into a given address.
     899             : /// \\ \param t The reference into which the new allow is constructed. 
     900             : template <class... ARGUMENTS>
     901         211 : inline void make_allow(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     902             : {
     903         211 :   atermpp::make_term_appl(t, core::detail::function_symbol_Allow(), args...);
     904         211 : }
     905             : 
     906             : /// \\brief Test for a allow expression
     907             : /// \\param x A term
     908             : /// \\return True if \\a x is a allow expression
     909             : inline
     910       82314 : bool is_allow(const atermpp::aterm_appl& x)
     911             : {
     912       82314 :   return x.function() == core::detail::function_symbols::Allow;
     913             : }
     914             : 
     915             : // prototype declaration
     916             : std::string pp(const allow& x);
     917             : 
     918             : /// \\brief Outputs the object to a stream
     919             : /// \\param out An output stream
     920             : /// \\param x Object x
     921             : /// \\return The output stream
     922             : inline
     923           0 : std::ostream& operator<<(std::ostream& out, const allow& x)
     924             : {
     925           0 :   return out << process::pp(x);
     926             : }
     927             : 
     928             : /// \\brief swap overload
     929             : inline void swap(allow& t1, allow& t2)
     930             : {
     931             :   t1.swap(t2);
     932             : }
     933             : 
     934             : 
     935             : /// \\brief The synchronization operator
     936             : class sync: public process_expression
     937             : {
     938             :   public:
     939             :     /// \\brief Default constructor.
     940             :     sync()
     941             :       : process_expression(core::detail::default_values::Sync)
     942             :     {}
     943             : 
     944             :     /// \\brief Constructor.
     945             :     /// \\param term A term
     946       11873 :     explicit sync(const atermpp::aterm& term)
     947       11873 :       : process_expression(term)
     948             :     {
     949       11873 :       assert(core::detail::check_term_Sync(*this));
     950       11873 :     }
     951             : 
     952             :     /// \\brief Constructor.
     953        2159 :     sync(const process_expression& left, const process_expression& right)
     954        2159 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Sync(), left, right))
     955        2159 :     {}
     956             : 
     957             :     /// Move semantics
     958             :     sync(const sync&) noexcept = default;
     959             :     sync(sync&&) noexcept = default;
     960             :     sync& operator=(const sync&) noexcept = default;
     961             :     sync& operator=(sync&&) noexcept = default;
     962             : 
     963        6762 :     const process_expression& left() const
     964             :     {
     965        6762 :       return atermpp::down_cast<process_expression>((*this)[0]);
     966             :     }
     967             : 
     968        6738 :     const process_expression& right() const
     969             :     {
     970        6738 :       return atermpp::down_cast<process_expression>((*this)[1]);
     971             :     }
     972             : };
     973             : 
     974             : /// \\brief Make_sync constructs a new term into a given address.
     975             : /// \\ \param t The reference into which the new sync is constructed. 
     976             : template <class... ARGUMENTS>
     977         975 : inline void make_sync(atermpp::aterm_appl& t, const ARGUMENTS&... args)
     978             : {
     979         975 :   atermpp::make_term_appl(t, core::detail::function_symbol_Sync(), args...);
     980         975 : }
     981             : 
     982             : /// \\brief Test for a sync expression
     983             : /// \\param x A term
     984             : /// \\return True if \\a x is a sync expression
     985             : inline
     986       83655 : bool is_sync(const atermpp::aterm_appl& x)
     987             : {
     988       83655 :   return x.function() == core::detail::function_symbols::Sync;
     989             : }
     990             : 
     991             : // prototype declaration
     992             : std::string pp(const sync& x);
     993             : 
     994             : /// \\brief Outputs the object to a stream
     995             : /// \\param out An output stream
     996             : /// \\param x Object x
     997             : /// \\return The output stream
     998             : inline
     999             : std::ostream& operator<<(std::ostream& out, const sync& x)
    1000             : {
    1001             :   return out << process::pp(x);
    1002             : }
    1003             : 
    1004             : /// \\brief swap overload
    1005             : inline void swap(sync& t1, sync& t2)
    1006             : {
    1007             :   t1.swap(t2);
    1008             : }
    1009             : 
    1010             : 
    1011             : /// \\brief The at operator
    1012             : class at: public process_expression
    1013             : {
    1014             :   public:
    1015             :     /// \\brief Default constructor.
    1016             :     at()
    1017             :       : process_expression(core::detail::default_values::AtTime)
    1018             :     {}
    1019             : 
    1020             :     /// \\brief Constructor.
    1021             :     /// \\param term A term
    1022        9164 :     explicit at(const atermpp::aterm& term)
    1023        9164 :       : process_expression(term)
    1024             :     {
    1025        9164 :       assert(core::detail::check_term_AtTime(*this));
    1026        9164 :     }
    1027             : 
    1028             :     /// \\brief Constructor.
    1029       10973 :     at(const process_expression& operand, const data::data_expression& time_stamp)
    1030       10973 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_AtTime(), operand, time_stamp))
    1031       10973 :     {}
    1032             : 
    1033             :     /// Move semantics
    1034             :     at(const at&) noexcept = default;
    1035             :     at(at&&) noexcept = default;
    1036             :     at& operator=(const at&) noexcept = default;
    1037             :     at& operator=(at&&) noexcept = default;
    1038             : 
    1039        6745 :     const process_expression& operand() const
    1040             :     {
    1041        6745 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1042             :     }
    1043             : 
    1044        4128 :     const data::data_expression& time_stamp() const
    1045             :     {
    1046        4128 :       return atermpp::down_cast<data::data_expression>((*this)[1]);
    1047             :     }
    1048             : };
    1049             : 
    1050             : /// \\brief Make_at constructs a new term into a given address.
    1051             : /// \\ \param t The reference into which the new at is constructed. 
    1052             : template <class... ARGUMENTS>
    1053        1027 : inline void make_at(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1054             : {
    1055        1027 :   atermpp::make_term_appl(t, core::detail::function_symbol_AtTime(), args...);
    1056        1027 : }
    1057             : 
    1058             : /// \\brief Test for a at expression
    1059             : /// \\param x A term
    1060             : /// \\return True if \\a x is a at expression
    1061             : inline
    1062       77986 : bool is_at(const atermpp::aterm_appl& x)
    1063             : {
    1064       77986 :   return x.function() == core::detail::function_symbols::AtTime;
    1065             : }
    1066             : 
    1067             : // prototype declaration
    1068             : std::string pp(const at& x);
    1069             : 
    1070             : /// \\brief Outputs the object to a stream
    1071             : /// \\param out An output stream
    1072             : /// \\param x Object x
    1073             : /// \\return The output stream
    1074             : inline
    1075             : std::ostream& operator<<(std::ostream& out, const at& x)
    1076             : {
    1077             :   return out << process::pp(x);
    1078             : }
    1079             : 
    1080             : /// \\brief swap overload
    1081             : inline void swap(at& t1, at& t2)
    1082             : {
    1083             :   t1.swap(t2);
    1084             : }
    1085             : 
    1086             : 
    1087             : /// \\brief The sequential composition
    1088             : class seq: public process_expression
    1089             : {
    1090             :   public:
    1091             :     /// \\brief Default constructor.
    1092             :     seq()
    1093             :       : process_expression(core::detail::default_values::Seq)
    1094             :     {}
    1095             : 
    1096             :     /// \\brief Constructor.
    1097             :     /// \\param term A term
    1098      103401 :     explicit seq(const atermpp::aterm& term)
    1099      103401 :       : process_expression(term)
    1100             :     {
    1101      103401 :       assert(core::detail::check_term_Seq(*this));
    1102      103401 :     }
    1103             : 
    1104             :     /// \\brief Constructor.
    1105       22797 :     seq(const process_expression& left, const process_expression& right)
    1106       22797 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Seq(), left, right))
    1107       22797 :     {}
    1108             : 
    1109             :     /// Move semantics
    1110             :     seq(const seq&) noexcept = default;
    1111             :     seq(seq&&) noexcept = default;
    1112             :     seq& operator=(const seq&) noexcept = default;
    1113             :     seq& operator=(seq&&) noexcept = default;
    1114             : 
    1115       59178 :     const process_expression& left() const
    1116             :     {
    1117       59178 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1118             :     }
    1119             : 
    1120       57424 :     const process_expression& right() const
    1121             :     {
    1122       57424 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1123             :     }
    1124             : };
    1125             : 
    1126             : /// \\brief Make_seq constructs a new term into a given address.
    1127             : /// \\ \param t The reference into which the new seq is constructed. 
    1128             : template <class... ARGUMENTS>
    1129        6823 : inline void make_seq(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1130             : {
    1131        6823 :   atermpp::make_term_appl(t, core::detail::function_symbol_Seq(), args...);
    1132        6822 : }
    1133             : 
    1134             : /// \\brief Test for a seq expression
    1135             : /// \\param x A term
    1136             : /// \\return True if \\a x is a seq expression
    1137             : inline
    1138      205975 : bool is_seq(const atermpp::aterm_appl& x)
    1139             : {
    1140      205975 :   return x.function() == core::detail::function_symbols::Seq;
    1141             : }
    1142             : 
    1143             : // prototype declaration
    1144             : std::string pp(const seq& x);
    1145             : 
    1146             : /// \\brief Outputs the object to a stream
    1147             : /// \\param out An output stream
    1148             : /// \\param x Object x
    1149             : /// \\return The output stream
    1150             : inline
    1151             : std::ostream& operator<<(std::ostream& out, const seq& x)
    1152             : {
    1153             :   return out << process::pp(x);
    1154             : }
    1155             : 
    1156             : /// \\brief swap overload
    1157             : inline void swap(seq& t1, seq& t2)
    1158             : {
    1159             :   t1.swap(t2);
    1160             : }
    1161             : 
    1162             : 
    1163             : /// \\brief The if-then operator
    1164             : class if_then: public process_expression
    1165             : {
    1166             :   public:
    1167             :     /// \\brief Default constructor.
    1168             :     if_then()
    1169             :       : process_expression(core::detail::default_values::IfThen)
    1170             :     {}
    1171             : 
    1172             :     /// \\brief Constructor.
    1173             :     /// \\param term A term
    1174       26699 :     explicit if_then(const atermpp::aterm& term)
    1175       26699 :       : process_expression(term)
    1176             :     {
    1177       26699 :       assert(core::detail::check_term_IfThen(*this));
    1178       26699 :     }
    1179             : 
    1180             :     /// \\brief Constructor.
    1181        5410 :     if_then(const data::data_expression& condition, const process_expression& then_case)
    1182        5410 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_IfThen(), condition, then_case))
    1183        5410 :     {}
    1184             : 
    1185             :     /// Move semantics
    1186             :     if_then(const if_then&) noexcept = default;
    1187             :     if_then(if_then&&) noexcept = default;
    1188             :     if_then& operator=(const if_then&) noexcept = default;
    1189             :     if_then& operator=(if_then&&) noexcept = default;
    1190             : 
    1191       13924 :     const data::data_expression& condition() const
    1192             :     {
    1193       13924 :       return atermpp::down_cast<data::data_expression>((*this)[0]);
    1194             :     }
    1195             : 
    1196       16632 :     const process_expression& then_case() const
    1197             :     {
    1198       16632 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1199             :     }
    1200             : };
    1201             : 
    1202             : /// \\brief Make_if_then constructs a new term into a given address.
    1203             : /// \\ \param t The reference into which the new if_then is constructed. 
    1204             : template <class... ARGUMENTS>
    1205        2141 : inline void make_if_then(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1206             : {
    1207        2141 :   atermpp::make_term_appl(t, core::detail::function_symbol_IfThen(), args...);
    1208        2141 : }
    1209             : 
    1210             : /// \\brief Test for a if_then expression
    1211             : /// \\param x A term
    1212             : /// \\return True if \\a x is a if_then expression
    1213             : inline
    1214      153377 : bool is_if_then(const atermpp::aterm_appl& x)
    1215             : {
    1216      153377 :   return x.function() == core::detail::function_symbols::IfThen;
    1217             : }
    1218             : 
    1219             : // prototype declaration
    1220             : std::string pp(const if_then& x);
    1221             : 
    1222             : /// \\brief Outputs the object to a stream
    1223             : /// \\param out An output stream
    1224             : /// \\param x Object x
    1225             : /// \\return The output stream
    1226             : inline
    1227             : std::ostream& operator<<(std::ostream& out, const if_then& x)
    1228             : {
    1229             :   return out << process::pp(x);
    1230             : }
    1231             : 
    1232             : /// \\brief swap overload
    1233             : inline void swap(if_then& t1, if_then& t2)
    1234             : {
    1235             :   t1.swap(t2);
    1236             : }
    1237             : 
    1238             : 
    1239             : /// \\brief The if-then-else operator
    1240             : class if_then_else: public process_expression
    1241             : {
    1242             :   public:
    1243             :     /// \\brief Default constructor.
    1244             :     if_then_else()
    1245             :       : process_expression(core::detail::default_values::IfThenElse)
    1246             :     {}
    1247             : 
    1248             :     /// \\brief Constructor.
    1249             :     /// \\param term A term
    1250        3873 :     explicit if_then_else(const atermpp::aterm& term)
    1251        3873 :       : process_expression(term)
    1252             :     {
    1253        3873 :       assert(core::detail::check_term_IfThenElse(*this));
    1254        3873 :     }
    1255             : 
    1256             :     /// \\brief Constructor.
    1257         435 :     if_then_else(const data::data_expression& condition, const process_expression& then_case, const process_expression& else_case)
    1258         435 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_IfThenElse(), condition, then_case, else_case))
    1259         435 :     {}
    1260             : 
    1261             :     /// Move semantics
    1262             :     if_then_else(const if_then_else&) noexcept = default;
    1263             :     if_then_else(if_then_else&&) noexcept = default;
    1264             :     if_then_else& operator=(const if_then_else&) noexcept = default;
    1265             :     if_then_else& operator=(if_then_else&&) noexcept = default;
    1266             : 
    1267        1167 :     const data::data_expression& condition() const
    1268             :     {
    1269        1167 :       return atermpp::down_cast<data::data_expression>((*this)[0]);
    1270             :     }
    1271             : 
    1272        1977 :     const process_expression& then_case() const
    1273             :     {
    1274        1977 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1275             :     }
    1276             : 
    1277        1977 :     const process_expression& else_case() const
    1278             :     {
    1279        1977 :       return atermpp::down_cast<process_expression>((*this)[2]);
    1280             :     }
    1281             : };
    1282             : 
    1283             : /// \\brief Make_if_then_else constructs a new term into a given address.
    1284             : /// \\ \param t The reference into which the new if_then_else is constructed. 
    1285             : template <class... ARGUMENTS>
    1286         375 : inline void make_if_then_else(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1287             : {
    1288         375 :   atermpp::make_term_appl(t, core::detail::function_symbol_IfThenElse(), args...);
    1289         375 : }
    1290             : 
    1291             : /// \\brief Test for a if_then_else expression
    1292             : /// \\param x A term
    1293             : /// \\return True if \\a x is a if_then_else expression
    1294             : inline
    1295       98727 : bool is_if_then_else(const atermpp::aterm_appl& x)
    1296             : {
    1297       98727 :   return x.function() == core::detail::function_symbols::IfThenElse;
    1298             : }
    1299             : 
    1300             : // prototype declaration
    1301             : std::string pp(const if_then_else& x);
    1302             : 
    1303             : /// \\brief Outputs the object to a stream
    1304             : /// \\param out An output stream
    1305             : /// \\param x Object x
    1306             : /// \\return The output stream
    1307             : inline
    1308             : std::ostream& operator<<(std::ostream& out, const if_then_else& x)
    1309             : {
    1310             :   return out << process::pp(x);
    1311             : }
    1312             : 
    1313             : /// \\brief swap overload
    1314             : inline void swap(if_then_else& t1, if_then_else& t2)
    1315             : {
    1316             :   t1.swap(t2);
    1317             : }
    1318             : 
    1319             : 
    1320             : /// \\brief The bounded initialization
    1321             : class bounded_init: public process_expression
    1322             : {
    1323             :   public:
    1324             :     /// \\brief Default constructor.
    1325             :     bounded_init()
    1326             :       : process_expression(core::detail::default_values::BInit)
    1327             :     {}
    1328             : 
    1329             :     /// \\brief Constructor.
    1330             :     /// \\param term A term
    1331           0 :     explicit bounded_init(const atermpp::aterm& term)
    1332           0 :       : process_expression(term)
    1333             :     {
    1334           0 :       assert(core::detail::check_term_BInit(*this));
    1335           0 :     }
    1336             : 
    1337             :     /// \\brief Constructor.
    1338           0 :     bounded_init(const process_expression& left, const process_expression& right)
    1339           0 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_BInit(), left, right))
    1340           0 :     {}
    1341             : 
    1342             :     /// Move semantics
    1343             :     bounded_init(const bounded_init&) noexcept = default;
    1344             :     bounded_init(bounded_init&&) noexcept = default;
    1345             :     bounded_init& operator=(const bounded_init&) noexcept = default;
    1346             :     bounded_init& operator=(bounded_init&&) noexcept = default;
    1347             : 
    1348           0 :     const process_expression& left() const
    1349             :     {
    1350           0 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1351             :     }
    1352             : 
    1353           0 :     const process_expression& right() const
    1354             :     {
    1355           0 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1356             :     }
    1357             : };
    1358             : 
    1359             : /// \\brief Make_bounded_init constructs a new term into a given address.
    1360             : /// \\ \param t The reference into which the new bounded_init is constructed. 
    1361             : template <class... ARGUMENTS>
    1362           0 : inline void make_bounded_init(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1363             : {
    1364           0 :   atermpp::make_term_appl(t, core::detail::function_symbol_BInit(), args...);
    1365           0 : }
    1366             : 
    1367             : /// \\brief Test for a bounded_init expression
    1368             : /// \\param x A term
    1369             : /// \\return True if \\a x is a bounded_init expression
    1370             : inline
    1371       17968 : bool is_bounded_init(const atermpp::aterm_appl& x)
    1372             : {
    1373       17968 :   return x.function() == core::detail::function_symbols::BInit;
    1374             : }
    1375             : 
    1376             : // prototype declaration
    1377             : std::string pp(const bounded_init& x);
    1378             : 
    1379             : /// \\brief Outputs the object to a stream
    1380             : /// \\param out An output stream
    1381             : /// \\param x Object x
    1382             : /// \\return The output stream
    1383             : inline
    1384             : std::ostream& operator<<(std::ostream& out, const bounded_init& x)
    1385             : {
    1386             :   return out << process::pp(x);
    1387             : }
    1388             : 
    1389             : /// \\brief swap overload
    1390             : inline void swap(bounded_init& t1, bounded_init& t2)
    1391             : {
    1392             :   t1.swap(t2);
    1393             : }
    1394             : 
    1395             : 
    1396             : /// \\brief The merge operator
    1397             : class merge: public process_expression
    1398             : {
    1399             :   public:
    1400             :     /// \\brief Default constructor.
    1401             :     merge()
    1402             :       : process_expression(core::detail::default_values::Merge)
    1403             :     {}
    1404             : 
    1405             :     /// \\brief Constructor.
    1406             :     /// \\param term A term
    1407        7632 :     explicit merge(const atermpp::aterm& term)
    1408        7632 :       : process_expression(term)
    1409             :     {
    1410        7632 :       assert(core::detail::check_term_Merge(*this));
    1411        7632 :     }
    1412             : 
    1413             :     /// \\brief Constructor.
    1414        1293 :     merge(const process_expression& left, const process_expression& right)
    1415        1293 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Merge(), left, right))
    1416        1293 :     {}
    1417             : 
    1418             :     /// Move semantics
    1419             :     merge(const merge&) noexcept = default;
    1420             :     merge(merge&&) noexcept = default;
    1421             :     merge& operator=(const merge&) noexcept = default;
    1422             :     merge& operator=(merge&&) noexcept = default;
    1423             : 
    1424        4673 :     const process_expression& left() const
    1425             :     {
    1426        4673 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1427             :     }
    1428             : 
    1429        4673 :     const process_expression& right() const
    1430             :     {
    1431        4673 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1432             :     }
    1433             : };
    1434             : 
    1435             : /// \\brief Make_merge constructs a new term into a given address.
    1436             : /// \\ \param t The reference into which the new merge is constructed. 
    1437             : template <class... ARGUMENTS>
    1438        1032 : inline void make_merge(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1439             : {
    1440        1032 :   atermpp::make_term_appl(t, core::detail::function_symbol_Merge(), args...);
    1441        1032 : }
    1442             : 
    1443             : /// \\brief Test for a merge expression
    1444             : /// \\param x A term
    1445             : /// \\return True if \\a x is a merge expression
    1446             : inline
    1447       92933 : bool is_merge(const atermpp::aterm_appl& x)
    1448             : {
    1449       92933 :   return x.function() == core::detail::function_symbols::Merge;
    1450             : }
    1451             : 
    1452             : // prototype declaration
    1453             : std::string pp(const merge& x);
    1454             : 
    1455             : /// \\brief Outputs the object to a stream
    1456             : /// \\param out An output stream
    1457             : /// \\param x Object x
    1458             : /// \\return The output stream
    1459             : inline
    1460             : std::ostream& operator<<(std::ostream& out, const merge& x)
    1461             : {
    1462             :   return out << process::pp(x);
    1463             : }
    1464             : 
    1465             : /// \\brief swap overload
    1466             : inline void swap(merge& t1, merge& t2)
    1467             : {
    1468             :   t1.swap(t2);
    1469             : }
    1470             : 
    1471             : 
    1472             : /// \\brief The left merge operator
    1473             : class left_merge: public process_expression
    1474             : {
    1475             :   public:
    1476             :     /// \\brief Default constructor.
    1477             :     left_merge()
    1478             :       : process_expression(core::detail::default_values::LMerge)
    1479             :     {}
    1480             : 
    1481             :     /// \\brief Constructor.
    1482             :     /// \\param term A term
    1483           0 :     explicit left_merge(const atermpp::aterm& term)
    1484           0 :       : process_expression(term)
    1485             :     {
    1486           0 :       assert(core::detail::check_term_LMerge(*this));
    1487           0 :     }
    1488             : 
    1489             :     /// \\brief Constructor.
    1490           0 :     left_merge(const process_expression& left, const process_expression& right)
    1491           0 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_LMerge(), left, right))
    1492           0 :     {}
    1493             : 
    1494             :     /// Move semantics
    1495             :     left_merge(const left_merge&) noexcept = default;
    1496             :     left_merge(left_merge&&) noexcept = default;
    1497             :     left_merge& operator=(const left_merge&) noexcept = default;
    1498             :     left_merge& operator=(left_merge&&) noexcept = default;
    1499             : 
    1500           0 :     const process_expression& left() const
    1501             :     {
    1502           0 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1503             :     }
    1504             : 
    1505           0 :     const process_expression& right() const
    1506             :     {
    1507           0 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1508             :     }
    1509             : };
    1510             : 
    1511             : /// \\brief Make_left_merge constructs a new term into a given address.
    1512             : /// \\ \param t The reference into which the new left_merge is constructed. 
    1513             : template <class... ARGUMENTS>
    1514           0 : inline void make_left_merge(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1515             : {
    1516           0 :   atermpp::make_term_appl(t, core::detail::function_symbol_LMerge(), args...);
    1517           0 : }
    1518             : 
    1519             : /// \\brief Test for a left_merge expression
    1520             : /// \\param x A term
    1521             : /// \\return True if \\a x is a left_merge expression
    1522             : inline
    1523       18884 : bool is_left_merge(const atermpp::aterm_appl& x)
    1524             : {
    1525       18884 :   return x.function() == core::detail::function_symbols::LMerge;
    1526             : }
    1527             : 
    1528             : // prototype declaration
    1529             : std::string pp(const left_merge& x);
    1530             : 
    1531             : /// \\brief Outputs the object to a stream
    1532             : /// \\param out An output stream
    1533             : /// \\param x Object x
    1534             : /// \\return The output stream
    1535             : inline
    1536             : std::ostream& operator<<(std::ostream& out, const left_merge& x)
    1537             : {
    1538             :   return out << process::pp(x);
    1539             : }
    1540             : 
    1541             : /// \\brief swap overload
    1542             : inline void swap(left_merge& t1, left_merge& t2)
    1543             : {
    1544             :   t1.swap(t2);
    1545             : }
    1546             : 
    1547             : 
    1548             : /// \\brief The choice operator
    1549             : class choice: public process_expression
    1550             : {
    1551             :   public:
    1552             :     /// \\brief Default constructor.
    1553             :     choice()
    1554             :       : process_expression(core::detail::default_values::Choice)
    1555             :     {}
    1556             : 
    1557             :     /// \\brief Constructor.
    1558             :     /// \\param term A term
    1559       39881 :     explicit choice(const atermpp::aterm& term)
    1560       39881 :       : process_expression(term)
    1561             :     {
    1562       39881 :       assert(core::detail::check_term_Choice(*this));
    1563       39881 :     }
    1564             : 
    1565             :     /// \\brief Constructor.
    1566        6574 :     choice(const process_expression& left, const process_expression& right)
    1567        6574 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_Choice(), left, right))
    1568        6574 :     {}
    1569             : 
    1570             :     /// Move semantics
    1571             :     choice(const choice&) noexcept = default;
    1572             :     choice(choice&&) noexcept = default;
    1573             :     choice& operator=(const choice&) noexcept = default;
    1574             :     choice& operator=(choice&&) noexcept = default;
    1575             : 
    1576       23280 :     const process_expression& left() const
    1577             :     {
    1578       23280 :       return atermpp::down_cast<process_expression>((*this)[0]);
    1579             :     }
    1580             : 
    1581       21617 :     const process_expression& right() const
    1582             :     {
    1583       21617 :       return atermpp::down_cast<process_expression>((*this)[1]);
    1584             :     }
    1585             : };
    1586             : 
    1587             : /// \\brief Make_choice constructs a new term into a given address.
    1588             : /// \\ \param t The reference into which the new choice is constructed. 
    1589             : template <class... ARGUMENTS>
    1590        2543 : inline void make_choice(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1591             : {
    1592        2543 :   atermpp::make_term_appl(t, core::detail::function_symbol_Choice(), args...);
    1593        2543 : }
    1594             : 
    1595             : /// \\brief Test for a choice expression
    1596             : /// \\param x A term
    1597             : /// \\return True if \\a x is a choice expression
    1598             : inline
    1599      203335 : bool is_choice(const atermpp::aterm_appl& x)
    1600             : {
    1601      203335 :   return x.function() == core::detail::function_symbols::Choice;
    1602             : }
    1603             : 
    1604             : // prototype declaration
    1605             : std::string pp(const choice& x);
    1606             : 
    1607             : /// \\brief Outputs the object to a stream
    1608             : /// \\param out An output stream
    1609             : /// \\param x Object x
    1610             : /// \\return The output stream
    1611             : inline
    1612             : std::ostream& operator<<(std::ostream& out, const choice& x)
    1613             : {
    1614             :   return out << process::pp(x);
    1615             : }
    1616             : 
    1617             : /// \\brief swap overload
    1618             : inline void swap(choice& t1, choice& t2)
    1619             : {
    1620             :   t1.swap(t2);
    1621             : }
    1622             : 
    1623             : 
    1624             : /// \\brief The distribution operator
    1625             : class stochastic_operator: public process_expression
    1626             : {
    1627             :   public:
    1628             :     /// \\brief Default constructor.
    1629             :     stochastic_operator()
    1630             :       : process_expression(core::detail::default_values::StochasticOperator)
    1631             :     {}
    1632             : 
    1633             :     /// \\brief Constructor.
    1634             :     /// \\param term A term
    1635        3514 :     explicit stochastic_operator(const atermpp::aterm& term)
    1636        3514 :       : process_expression(term)
    1637             :     {
    1638        3514 :       assert(core::detail::check_term_StochasticOperator(*this));
    1639        3514 :     }
    1640             : 
    1641             :     /// \\brief Constructor.
    1642        1624 :     stochastic_operator(const data::variable_list& variables, const data::data_expression& distribution, const process_expression& operand)
    1643        1624 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_StochasticOperator(), variables, distribution, operand))
    1644        1624 :     {}
    1645             : 
    1646             :     /// Move semantics
    1647          50 :     stochastic_operator(const stochastic_operator&) noexcept = default;
    1648             :     stochastic_operator(stochastic_operator&&) noexcept = default;
    1649             :     stochastic_operator& operator=(const stochastic_operator&) noexcept = default;
    1650             :     stochastic_operator& operator=(stochastic_operator&&) noexcept = default;
    1651             : 
    1652        3251 :     const data::variable_list& variables() const
    1653             :     {
    1654        3251 :       return atermpp::down_cast<data::variable_list>((*this)[0]);
    1655             :     }
    1656             : 
    1657        2533 :     const data::data_expression& distribution() const
    1658             :     {
    1659        2533 :       return atermpp::down_cast<data::data_expression>((*this)[1]);
    1660             :     }
    1661             : 
    1662        3575 :     const process_expression& operand() const
    1663             :     {
    1664        3575 :       return atermpp::down_cast<process_expression>((*this)[2]);
    1665             :     }
    1666             : };
    1667             : 
    1668             : /// \\brief Make_stochastic_operator constructs a new term into a given address.
    1669             : /// \\ \param t The reference into which the new stochastic_operator is constructed. 
    1670             : template <class... ARGUMENTS>
    1671         415 : inline void make_stochastic_operator(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1672             : {
    1673         415 :   atermpp::make_term_appl(t, core::detail::function_symbol_StochasticOperator(), args...);
    1674         415 : }
    1675             : 
    1676             : /// \\brief Test for a stochastic_operator expression
    1677             : /// \\param x A term
    1678             : /// \\return True if \\a x is a stochastic_operator expression
    1679             : inline
    1680      136311 : bool is_stochastic_operator(const atermpp::aterm_appl& x)
    1681             : {
    1682      136311 :   return x.function() == core::detail::function_symbols::StochasticOperator;
    1683             : }
    1684             : 
    1685             : // prototype declaration
    1686             : std::string pp(const stochastic_operator& x);
    1687             : 
    1688             : /// \\brief Outputs the object to a stream
    1689             : /// \\param out An output stream
    1690             : /// \\param x Object x
    1691             : /// \\return The output stream
    1692             : inline
    1693             : std::ostream& operator<<(std::ostream& out, const stochastic_operator& x)
    1694             : {
    1695             :   return out << process::pp(x);
    1696             : }
    1697             : 
    1698             : /// \\brief swap overload
    1699             : inline void swap(stochastic_operator& t1, stochastic_operator& t2)
    1700             : {
    1701             :   t1.swap(t2);
    1702             : }
    1703             : 
    1704             : 
    1705             : /// \\brief An untyped process assginment
    1706             : class untyped_process_assignment: public process_expression
    1707             : {
    1708             :   public:
    1709             :     /// \\brief Default constructor.
    1710             :     untyped_process_assignment()
    1711             :       : process_expression(core::detail::default_values::UntypedProcessAssignment)
    1712             :     {}
    1713             : 
    1714             :     /// \\brief Constructor.
    1715             :     /// \\param term A term
    1716         882 :     explicit untyped_process_assignment(const atermpp::aterm& term)
    1717         882 :       : process_expression(term)
    1718             :     {
    1719         882 :       assert(core::detail::check_term_UntypedProcessAssignment(*this));
    1720         882 :     }
    1721             : 
    1722             :     /// \\brief Constructor.
    1723         441 :     untyped_process_assignment(const core::identifier_string& name, const data::untyped_identifier_assignment_list& assignments)
    1724         441 :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_UntypedProcessAssignment(), name, assignments))
    1725         441 :     {}
    1726             : 
    1727             :     /// \\brief Constructor.
    1728             :     untyped_process_assignment(const std::string& name, const data::untyped_identifier_assignment_list& assignments)
    1729             :       : process_expression(atermpp::aterm_appl(core::detail::function_symbol_UntypedProcessAssignment(), core::identifier_string(name), assignments))
    1730             :     {}
    1731             : 
    1732             :     /// Move semantics
    1733             :     untyped_process_assignment(const untyped_process_assignment&) noexcept = default;
    1734             :     untyped_process_assignment(untyped_process_assignment&&) noexcept = default;
    1735             :     untyped_process_assignment& operator=(const untyped_process_assignment&) noexcept = default;
    1736             :     untyped_process_assignment& operator=(untyped_process_assignment&&) noexcept = default;
    1737             : 
    1738        1323 :     const core::identifier_string& name() const
    1739             :     {
    1740        1323 :       return atermpp::down_cast<core::identifier_string>((*this)[0]);
    1741             :     }
    1742             : 
    1743        1763 :     const data::untyped_identifier_assignment_list& assignments() const
    1744             :     {
    1745        1763 :       return atermpp::down_cast<data::untyped_identifier_assignment_list>((*this)[1]);
    1746             :     }
    1747             : };
    1748             : 
    1749             : /// \\brief Make_untyped_process_assignment constructs a new term into a given address.
    1750             : /// \\ \param t The reference into which the new untyped_process_assignment is constructed. 
    1751             : template <class... ARGUMENTS>
    1752         441 : inline void make_untyped_process_assignment(atermpp::aterm_appl& t, const ARGUMENTS&... args)
    1753             : {
    1754         441 :   atermpp::make_term_appl(t, core::detail::function_symbol_UntypedProcessAssignment(), args...);
    1755         441 : }
    1756             : 
    1757             : /// \\brief Test for a untyped_process_assignment expression
    1758             : /// \\param x A term
    1759             : /// \\return True if \\a x is a untyped_process_assignment expression
    1760             : inline
    1761         882 : bool is_untyped_process_assignment(const atermpp::aterm_appl& x)
    1762             : {
    1763         882 :   return x.function() == core::detail::function_symbols::UntypedProcessAssignment;
    1764             : }
    1765             : 
    1766             : // prototype declaration
    1767             : std::string pp(const untyped_process_assignment& x);
    1768             : 
    1769             : /// \\brief Outputs the object to a stream
    1770             : /// \\param out An output stream
    1771             : /// \\param x Object x
    1772             : /// \\return The output stream
    1773             : inline
    1774           0 : std::ostream& operator<<(std::ostream& out, const untyped_process_assignment& x)
    1775             : {
    1776           0 :   return out << process::pp(x);
    1777             : }
    1778             : 
    1779             : /// \\brief swap overload
    1780             : inline void swap(untyped_process_assignment& t1, untyped_process_assignment& t2)
    1781             : {
    1782             :   t1.swap(t2);
    1783             : }
    1784             : //--- end generated classes ---//
    1785             : 
    1786             : // template function overloads
    1787             : std::string pp(const process_expression_list& x);
    1788             : std::string pp(const process_expression_vector& x);
    1789             : std::set<data::sort_expression> find_sort_expressions(const process::process_expression& x);
    1790             : std::string pp(const action_list& x);
    1791             : std::string pp(const action_vector& x);
    1792             : action normalize_sorts(const action& x, const data::sort_specification& sortspec);
    1793             : action translate_user_notation(const action& x);
    1794             : process::process_expression translate_user_notation(const process::process_expression& x);
    1795             : std::set<data::variable> find_all_variables(const action& x);
    1796             : std::set<data::variable> find_free_variables(const action& x);
    1797             : 
    1798             : /// \brief Compares the signatures of two actions
    1799             : /// \param a An action
    1800             : /// \param b An action
    1801             : /// \return Returns true if the actions a and b have the same label, and
    1802             : /// the sorts of the arguments of a and b are equal.
    1803             : inline
    1804          28 : bool equal_signatures(const action& a, const action& b)
    1805             : {
    1806          28 :   if (a.label() != b.label())
    1807             :   {
    1808          16 :     return false;
    1809             :   }
    1810             : 
    1811          12 :   const data::data_expression_list& a_args = a.arguments();
    1812          12 :   const data::data_expression_list& b_args = b.arguments();
    1813             : 
    1814          12 :   if (a_args.size() != b_args.size())
    1815             :   {
    1816           0 :     return false;
    1817             :   }
    1818             : 
    1819          26 :   return std::equal(a_args.begin(), a_args.end(), b_args.begin(), [](const data::data_expression& x, const data::data_expression& y) { return x.sort() == y.sort(); });
    1820             : }
    1821             : 
    1822             : } // namespace process
    1823             : 
    1824             : } // namespace mcrl2
    1825             : 
    1826             : namespace std
    1827             : {
    1828             : 
    1829             : /// \brief Standard has function for actions.
    1830             : template <>
    1831             : struct hash<mcrl2::process::action>
    1832             : {
    1833             :   std::size_t operator()(const mcrl2::process::action& t) const
    1834             :   {
    1835             :     return std::hash<atermpp::aterm>()(t);
    1836             :   }
    1837             : 
    1838             : };
    1839             : 
    1840             : 
    1841             : } // namespace std
    1842             : 
    1843             : #endif // MCRL2_PROCESS_PROCESS_EXPRESSION_H

Generated by: LCOV version 1.14