| /******************************************************************************* |
| * Copyright (c) 2016 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Created on: 22 juin 2010 |
| * |
| * Contributors: |
| * Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr |
| * - Initial API and implementation |
| ******************************************************************************/ |
| |
| #ifndef OPERATORLIB_H_ |
| #define OPERATORLIB_H_ |
| |
| #include <util/avm_numeric.h> |
| #include <util/avm_string.h> |
| |
| |
| namespace sep |
| { |
| |
| |
| /** |
| * ENUMERATE DECLARATIONS |
| */ |
| enum ALGEBRA_QUALIFIER |
| { |
| ALGEBRA_STD, |
| |
| ALGEBRA_ASSOC, |
| ALGEBRA_LEFT_ASSOC, |
| ALGEBRA_RIGHT_ASSOC, |
| |
| ALGEBRA_COMM, |
| |
| ALGEBRA_ASSOC_COMM |
| }; |
| |
| |
| enum FIX_NOTATION |
| { |
| NOTATION_INFIX, |
| NOTATION_PREFIX, |
| NOTATION_SUFFIX, |
| |
| NOTATION_FUNCTION, |
| |
| NOTATION_STATEMENT |
| }; |
| |
| |
| enum AVM_OPCODE |
| { |
| AVM_OPCODE_NULL, |
| |
| /* |
| *************************************************************************** |
| * AVM NOP STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_NOP, |
| |
| AVM_OPCODE_FAILED, |
| AVM_OPCODE_THROW, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM META STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_INFORMAL, |
| |
| AVM_OPCODE_TRACE, |
| |
| AVM_OPCODE_DEBUG, |
| |
| AVM_OPCODE_COMMENT, |
| |
| AVM_OPCODE_QUOTE, |
| |
| AVM_OPCODE_META_EVAL, |
| AVM_OPCODE_META_RUN, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM UFI STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_UFI, |
| |
| /* |
| *************************************************************************** |
| * AVM FORM CONSTRUCTOR STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_CTOR, |
| |
| /* |
| *************************************************************************** |
| * AVM FORM REGEX STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_REGEX, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM MACHINE MANAGING |
| *************************************************************************** |
| */ |
| AVM_OPCODE_CONTEXT_SWITCHER, |
| |
| AVM_OPCODE_INIT, |
| AVM_OPCODE_FINAL, |
| AVM_OPCODE_DESTROY, |
| |
| AVM_OPCODE_START, |
| AVM_OPCODE_RESTART, |
| AVM_OPCODE_STOP, |
| |
| AVM_OPCODE_WAIT, |
| |
| AVM_OPCODE_SUSPEND, |
| AVM_OPCODE_RESUME, |
| |
| AVM_OPCODE_IENABLE_INVOKE, |
| AVM_OPCODE_ENABLE_INVOKE, |
| AVM_OPCODE_ENABLE_SET, |
| |
| AVM_OPCODE_IDISABLE_INVOKE, |
| AVM_OPCODE_DISABLE_INVOKE, |
| AVM_OPCODE_DISABLE_SET, |
| AVM_OPCODE_DISABLE_CHILD, |
| AVM_OPCODE_DISABLE_SELF, |
| AVM_OPCODE_DISABLE_SELVES, |
| |
| AVM_OPCODE_IABORT_INVOKE, |
| AVM_OPCODE_ABORT_INVOKE, |
| AVM_OPCODE_ABORT_SET, |
| AVM_OPCODE_ABORT_CHILD, |
| AVM_OPCODE_ABORT_SELF, |
| AVM_OPCODE_ABORT_SELVES, |
| |
| AVM_OPCODE_HISTORY_CLEAR, |
| AVM_OPCODE_DEEP_HISTORY_INVOKE, |
| AVM_OPCODE_SHALLOW_HISTORY_INVOKE, |
| |
| AVM_OPCODE_IRUN, |
| AVM_OPCODE_RUN, |
| AVM_OPCODE_RTC, |
| |
| AVM_OPCODE_SCHEDULE_INVOKE, |
| AVM_OPCODE_SCHEDULE_GET, |
| AVM_OPCODE_SCHEDULE_IN, |
| AVM_OPCODE_SCHEDULE_SET, |
| |
| AVM_OPCODE_DEFER_INVOKE, |
| AVM_OPCODE_DEFER_GET, |
| AVM_OPCODE_DEFER_SET, |
| |
| |
| AVM_OPCODE_GOTO, |
| |
| AVM_OPCODE_FORK, |
| AVM_OPCODE_JOIN, |
| |
| AVM_OPCODE_INPUT_ENABLED, |
| |
| AVM_OPCODE_RDV, |
| |
| AVM_OPCODE_SYNCHRONIZE, |
| |
| |
| AVM_OPCODE_INVOKE_NEW, |
| |
| AVM_OPCODE_INVOKE_ROUTINE, |
| |
| AVM_OPCODE_INVOKE_TRANSITION, |
| |
| AVM_OPCODE_INVOKE_METHOD, |
| AVM_OPCODE_INVOKE_PROGRAM, |
| AVM_OPCODE_INVOKE_FUNCTION, |
| |
| AVM_OPCODE_INVOKE_LAMBDA_APPLY, |
| AVM_OPCODE_INVOKE_LAMBDA_LET, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM MACHINE STATUS |
| *************************************************************************** |
| */ |
| AVM_OPCODE_STATUS_WAS, |
| AVM_OPCODE_STATUS_IS, |
| AVM_OPCODE_STATUS_BEING, |
| AVM_OPCODE_STATUS_WILL, |
| |
| AVM_OPCODE_CHANGED, |
| AVM_OPCODE_CHANGED_TO, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM PROGRAM SCHEDULING |
| *************************************************************************** |
| */ |
| AVM_OPCODE_ASYNCHRONOUS, |
| AVM_OPCODE_STRONG_SYNCHRONOUS, |
| AVM_OPCODE_WEAK_SYNCHRONOUS, |
| |
| AVM_OPCODE_INTERLEAVING, |
| AVM_OPCODE_PARTIAL_ORDER_REDUCTION, |
| |
| |
| AVM_OPCODE_PARALLEL, |
| |
| // Optimized version of concurrency for RDV synchronization |
| AVM_OPCODE_RDV_ASYNCHRONOUS, |
| AVM_OPCODE_RDV_STRONG_SYNCHRONOUS, |
| AVM_OPCODE_RDV_WEAK_SYNCHRONOUS, |
| |
| AVM_OPCODE_RDV_INTERLEAVING, |
| AVM_OPCODE_RDV_PARTIAL_ORDER_REDUCTION, |
| |
| AVM_OPCODE_RDV_PARALLEL, |
| |
| AVM_OPCODE_EXCLUSIVE, |
| |
| AVM_OPCODE_NONDETERMINISM, |
| |
| AVM_OPCODE_PRIOR_GT, |
| AVM_OPCODE_PRIOR_LT, |
| |
| AVM_OPCODE_SCHEDULE_AND_THEN, |
| AVM_OPCODE_SCHEDULE_OR_ELSE, |
| |
| AVM_OPCODE_ATOMIC_SEQUENCE, |
| |
| AVM_OPCODE_SEQUENCE, |
| AVM_OPCODE_SEQUENCE_SIDE, |
| AVM_OPCODE_SEQUENCE_WEAK, |
| |
| AVM_OPCODE_PRODUCT, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM BUFFER MANAGING |
| *************************************************************************** |
| */ |
| AVM_OPCODE_UPDATE_BUFFER, |
| |
| |
| /* |
| *************************************************************************** |
| * LAMBDA STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_APPLY, |
| |
| AVM_OPCODE_LAMBDA, |
| |
| |
| /* |
| *************************************************************************** |
| * FUNCTIONB STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_FUN, |
| |
| |
| /* |
| *************************************************************************** |
| * LET STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_LET, |
| |
| /* |
| *************************************************************************** |
| * LOOKUP STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_LOOKUP_INT_EXT, |
| AVM_OPCODE_LOOKUP_INT, |
| AVM_OPCODE_LOOKUP_NEAREST, |
| AVM_OPCODE_LOOKUP_BELOW, |
| AVM_OPCODE_LOOKUP_ABOVE, |
| AVM_OPCODE_LOOKUP2D_INT_EXT, |
| |
| /* |
| *************************************************************************** |
| * AVM PRIMITIVE STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_ASSIGN, |
| AVM_OPCODE_ASSIGN_AFTER, |
| AVM_OPCODE_ASSIGN_OP, |
| AVM_OPCODE_ASSIGN_OP_AFTER, |
| AVM_OPCODE_ASSIGN_REF, |
| AVM_OPCODE_ASSIGN_MACRO, |
| |
| AVM_OPCODE_ASSIGN_NEWFRESH, |
| |
| AVM_OPCODE_ASSIGN_RESET, |
| |
| |
| AVM_OPCODE_GUARD, |
| AVM_OPCODE_TIMED_GUARD, |
| |
| AVM_OPCODE_EVENT, |
| |
| AVM_OPCODE_CHECK_SAT, |
| |
| AVM_OPCODE_INPUT, |
| AVM_OPCODE_INPUT_FROM, |
| |
| AVM_OPCODE_INPUT_SAVE, |
| |
| // Optimized version of INPUT |
| AVM_OPCODE_INPUT_ENV, |
| AVM_OPCODE_INPUT_VAR, |
| AVM_OPCODE_INPUT_FLOW, |
| AVM_OPCODE_INPUT_BUFFER, |
| AVM_OPCODE_INPUT_RDV, |
| AVM_OPCODE_INPUT_MULTI_RDV, |
| AVM_OPCODE_INPUT_BROADCAST, |
| AVM_OPCODE_INPUT_DELEGATE, |
| |
| AVM_OPCODE_OUTPUT, |
| AVM_OPCODE_OUTPUT_TO, |
| // Optimized version of OUTPUT |
| AVM_OPCODE_OUTPUT_ENV, |
| AVM_OPCODE_OUTPUT_VAR, |
| AVM_OPCODE_OUTPUT_FLOW, |
| AVM_OPCODE_OUTPUT_BUFFER, |
| AVM_OPCODE_OUTPUT_RDV, |
| AVM_OPCODE_OUTPUT_MULTI_RDV, |
| AVM_OPCODE_OUTPUT_BROADCAST, |
| AVM_OPCODE_OUTPUT_DELEGATE, |
| |
| AVM_OPCODE_PRESENT, |
| AVM_OPCODE_ABSENT, |
| |
| AVM_OPCODE_IF, |
| AVM_OPCODE_IFE, |
| |
| AVM_OPCODE_WHERE, |
| AVM_OPCODE_WHERE_ELSE, |
| |
| AVM_OPCODE_FOR, |
| AVM_OPCODE_FOREACH, |
| AVM_OPCODE_WHILE_DO, |
| AVM_OPCODE_DO_WHILE, |
| |
| AVM_OPCODE_BREAK, |
| AVM_OPCODE_CONTINUE, |
| AVM_OPCODE_RETURN, |
| AVM_OPCODE_EXIT, |
| |
| AVM_OPCODE_STEP_MARK, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM QUANTIFIER EXPRESSION |
| *************************************************************************** |
| */ |
| AVM_OPCODE_EXIST, |
| AVM_OPCODE_FORALL, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM PREDICAT EXPRESSION |
| *************************************************************************** |
| */ |
| AVM_OPCODE_NOT, |
| |
| AVM_OPCODE_AND, |
| AVM_OPCODE_AND_THEN, |
| |
| AVM_OPCODE_NAND, |
| |
| AVM_OPCODE_XAND, |
| |
| AVM_OPCODE_OR, |
| AVM_OPCODE_OR_ELSE, |
| |
| AVM_OPCODE_NOR, |
| |
| AVM_OPCODE_XOR, |
| AVM_OPCODE_XNOR, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM INTEGER BIT A BIT OPERATOR |
| *************************************************************************** |
| */ |
| AVM_OPCODE_BNOT, |
| |
| AVM_OPCODE_BAND, |
| AVM_OPCODE_BOR, |
| AVM_OPCODE_BXOR, |
| |
| AVM_OPCODE_LSHIFT, |
| AVM_OPCODE_RSHIFT, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM COMPARISON EXPRESSION |
| *************************************************************************** |
| */ |
| |
| AVM_OPCODE_EQ, |
| AVM_OPCODE_NEQ, |
| |
| AVM_OPCODE_SEQ, |
| AVM_OPCODE_NSEQ, |
| |
| AVM_OPCODE_LT, |
| AVM_OPCODE_LTE, |
| AVM_OPCODE_GT, |
| AVM_OPCODE_GTE, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM ARITHMETIC EXPRESSION |
| *************************************************************************** |
| */ |
| |
| AVM_OPCODE_PLUS, |
| AVM_OPCODE_MINUS, |
| AVM_OPCODE_UMINUS, |
| |
| AVM_OPCODE_MULT, |
| AVM_OPCODE_POW, |
| |
| AVM_OPCODE_DIV, |
| AVM_OPCODE_MOD, |
| |
| AVM_OPCODE_MIN, |
| AVM_OPCODE_MAX, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM MATHEMATICAL FUNCTION |
| *************************************************************************** |
| */ |
| // RANDOM |
| AVM_OPCODE_RANDOM, |
| |
| // ROUNDING |
| AVM_OPCODE_ABS, |
| |
| AVM_OPCODE_CEIL, |
| AVM_OPCODE_FLOOR, |
| AVM_OPCODE_ROUND, |
| AVM_OPCODE_TRUNCATE, |
| |
| |
| // EXP - LOG |
| AVM_OPCODE_SQRT, |
| |
| AVM_OPCODE_EXP, |
| AVM_OPCODE_LN, |
| AVM_OPCODE_LOG, |
| |
| // TRIGONOMETRIC |
| AVM_OPCODE_SIN, |
| AVM_OPCODE_COS, |
| AVM_OPCODE_TAN, |
| |
| AVM_OPCODE_SINH, |
| AVM_OPCODE_COSH, |
| AVM_OPCODE_TANH, |
| |
| AVM_OPCODE_ASIN, |
| AVM_OPCODE_ACOS, |
| AVM_OPCODE_ATAN, |
| AVM_OPCODE_ATAN2, |
| |
| AVM_OPCODE_ASINH, |
| AVM_OPCODE_ACOSH, |
| AVM_OPCODE_ATANH, |
| |
| |
| /* |
| *************************************************************************** |
| * AVM STRING / CONTAINER OPERATOR |
| *************************************************************************** |
| */ |
| AVM_OPCODE_CONTAINS, |
| |
| AVM_OPCODE_IN, |
| AVM_OPCODE_NOTIN, |
| |
| AVM_OPCODE_SUBSET, |
| AVM_OPCODE_SUBSETEQ, |
| |
| AVM_OPCODE_INTERSECT, |
| |
| AVM_OPCODE_STARTS_WITH, |
| AVM_OPCODE_ENDS_WITH, |
| |
| AVM_OPCODE_CONCAT, |
| |
| |
| AVM_OPCODE_APPEND, |
| |
| AVM_OPCODE_REMOVE, |
| AVM_OPCODE_CLEAR, |
| |
| AVM_OPCODE_RESIZE, |
| |
| AVM_OPCODE_SELECT, |
| |
| AVM_OPCODE_PUSH, |
| AVM_OPCODE_ASSIGN_TOP, |
| AVM_OPCODE_TOP, |
| AVM_OPCODE_POP, |
| AVM_OPCODE_POP_FROM, |
| |
| AVM_OPCODE_EMPTY, |
| AVM_OPCODE_NONEMPTY, |
| AVM_OPCODE_SINGLETON, |
| AVM_OPCODE_POPULATED, |
| AVM_OPCODE_FULL, |
| |
| AVM_OPCODE_SIZE, |
| |
| /* |
| *************************************************************************** |
| * CTL* , IOLTL STATEMENT |
| *************************************************************************** |
| */ |
| AVM_OPCODE_NECESSARILY, // A :> in All path |
| AVM_OPCODE_POSSIBLY, // E :> the Exist a path |
| |
| AVM_OPCODE_GLOBALLY, // G , \square , [] :> always in the future |
| AVM_OPCODE_EVENTUALLY, // F , \diamond ' <> :> (or Finally) some time in the Future |
| |
| AVM_OPCODE_NEXT, // X , \circle , o :> neXtime |
| |
| AVM_OPCODE_UNTIL, // U :> (p U q ) <=> p holds Until q holds (and ! p) |
| |
| AVM_OPCODE_UNLESS, // W :> (p W q ) <=> Weak Until (or waiting for) |
| // <=> (G p) or (p U q) |
| // as long as q is false, p must be true |
| |
| AVM_OPCODE_RELEASES, // R :> (p R q ) <=> q holds Until p holds (with q) |
| // <=> not ((not p) U (not q)) |
| AVM_OPCODE_AND_T, |
| AVM_OPCODE_OR_T, |
| AVM_OPCODE_NOT_T, |
| AVM_OPCODE_IMP_T, |
| |
| AVM_OPCODE_OBS, |
| |
| }; |
| |
| |
| |
| enum ENUM_PRINT_OPERATOR_FORMAT |
| { |
| PRINT_OPERATOR_UNDEFINED_FORMAT, |
| |
| PRINT_OPERATOR_NAME_FORMAT, |
| |
| PRINT_OPERATOR_SYMBOL_FORMAT, |
| |
| PRINT_OPERATOR_MIXFIX_FORMAT, |
| |
| PRINT_OPERATOR_CAS_QEPCAD_FORMAT |
| }; |
| |
| |
| |
| class OperatorLib |
| { |
| |
| public: |
| |
| /** |
| * TEST |
| */ |
| static bool isPropositional(AVM_OPCODE opcode); |
| |
| |
| static std::string to_string(FIX_NOTATION fix); |
| |
| static FIX_NOTATION to_fix(const std::string & op, |
| FIX_NOTATION defaultFix = NOTATION_INFIX); |
| |
| |
| static std::string to_string(AVM_OPCODE opcode, |
| ENUM_PRINT_OPERATOR_FORMAT printFormat = |
| PRINT_OPERATOR_SYMBOL_FORMAT); |
| |
| static AVM_OPCODE toOpcode(const std::string & op, |
| AVM_OPCODE defaultOpcode = AVM_OPCODE_NULL); |
| |
| }; |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // OperatorFamily |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| class AvmCode; |
| |
| |
| class IStatementFamily |
| { |
| |
| public: |
| |
| typedef avm_uint32_t avm_opcode_family; |
| |
| enum |
| { |
| AVM_STATEMENT_UNDEFINED_FAMILY = 0x00000, |
| |
| AVM_STATEMENT_BASIC_FAMILY = 0x00001, |
| |
| AVM_STATEMENT_GUARD_FAMILY = 0x00002, |
| |
| |
| AVM_STATEMENT_INPUT_FAMILY = 0x00010, |
| AVM_STATEMENT_INPUT_ENV_FAMILY = 0x00020, |
| AVM_STATEMENT_INPUT_SYNC_FAMILY = 0x00040, |
| AVM_STATEMENT_INPUT_ASYNC_FAMILY = 0x00080, |
| |
| AVM_STATEMENT_INPUT_ANY_FAMILY = AVM_STATEMENT_INPUT_FAMILY |
| | AVM_STATEMENT_INPUT_ENV_FAMILY |
| | AVM_STATEMENT_INPUT_SYNC_FAMILY |
| | AVM_STATEMENT_INPUT_ASYNC_FAMILY, |
| |
| |
| AVM_STATEMENT_OUTPUT_FAMILY = 0x00100, |
| AVM_STATEMENT_OUTPUT_ENV_FAMILY = 0x00200, |
| AVM_STATEMENT_OUTPUT_SYNC_FAMILY = 0x00400, |
| AVM_STATEMENT_OUTPUT_ASYNC_FAMILY = 0x00800, |
| |
| AVM_STATEMENT_OUTPUT_ANY_FAMILY = AVM_STATEMENT_OUTPUT_FAMILY |
| | AVM_STATEMENT_OUTPUT_ENV_FAMILY |
| | AVM_STATEMENT_OUTPUT_SYNC_FAMILY |
| | AVM_STATEMENT_OUTPUT_ASYNC_FAMILY, |
| |
| |
| AVM_STATEMENT_COM_FAMILY = AVM_STATEMENT_INPUT_FAMILY |
| | AVM_STATEMENT_OUTPUT_FAMILY, |
| |
| AVM_STATEMENT_COM_ENV_FAMILY = AVM_STATEMENT_INPUT_ENV_FAMILY |
| | AVM_STATEMENT_OUTPUT_ENV_FAMILY, |
| |
| AVM_STATEMENT_COM_ASYNC_FAMILY = AVM_STATEMENT_INPUT_ASYNC_FAMILY |
| | AVM_STATEMENT_OUTPUT_ASYNC_FAMILY, |
| |
| AVM_STATEMENT_COM_SYNC_FAMILY = AVM_STATEMENT_INPUT_SYNC_FAMILY |
| | AVM_STATEMENT_OUTPUT_SYNC_FAMILY, |
| |
| AVM_STATEMENT_COM_ANY_FAMILY = AVM_STATEMENT_INPUT_ANY_FAMILY |
| | AVM_STATEMENT_OUTPUT_ANY_FAMILY, |
| |
| |
| AVM_STATEMENT_UNCONDIONAL_CLASS = AVM_STATEMENT_BASIC_FAMILY |
| | AVM_STATEMENT_COM_ENV_FAMILY, |
| |
| |
| AVM_STATEMENT_COM_CONDITIONAL_CLASS = AVM_STATEMENT_COM_FAMILY |
| | AVM_STATEMENT_COM_ASYNC_FAMILY |
| | AVM_STATEMENT_COM_SYNC_FAMILY, |
| |
| AVM_STATEMENT_CONDIONAL_CLASS = AVM_STATEMENT_GUARD_FAMILY |
| | AVM_STATEMENT_COM_CONDITIONAL_CLASS, |
| |
| |
| AVM_STATEMENT_MASK_ALL_FAMILY = 0xFFFFF, |
| |
| }; |
| |
| |
| protected: |
| /* |
| * ATTRIBUTES |
| */ |
| avm_opcode_family theStatementFamily; |
| |
| |
| public: |
| /** |
| * CONSTRUCTOR |
| * Default |
| */ |
| IStatementFamily(avm_opcode_family |
| aCodeFamily = AVM_STATEMENT_UNDEFINED_FAMILY) |
| : theStatementFamily( aCodeFamily ) |
| { |
| //!! NOTHING |
| } |
| |
| /** |
| * DESTRUCTOR |
| */ |
| virtual ~IStatementFamily() |
| { |
| //!! NOTHING |
| } |
| |
| /** |
| * GETTER - SETTER |
| * theCodeFamily |
| */ |
| inline avm_opcode_family getStatementFamily() const |
| { |
| return( theStatementFamily ); |
| } |
| |
| inline bool hasStatementFamily() const |
| { |
| return( theStatementFamily != AVM_STATEMENT_UNDEFINED_FAMILY ); |
| } |
| |
| inline void setStatementFamily(avm_opcode_family aCodeFamily) |
| { |
| theStatementFamily = aCodeFamily; |
| } |
| |
| |
| inline void updateStatementFamily(AvmCode * aCode) |
| { |
| theStatementFamily = computeStatementFamily( aCode ); |
| } |
| |
| static avm_opcode_family computeStatementFamily(AVM_OPCODE opcode); |
| |
| static avm_opcode_family computeStatementFamily(AvmCode * aCode); |
| |
| /** |
| * TEST |
| * theCodeFamily |
| */ |
| inline bool hasStatementBasicFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_BASIC_FAMILY) != 0 ); |
| } |
| |
| inline bool isStatementBasicFamily() const |
| { |
| return( theStatementFamily == AVM_STATEMENT_BASIC_FAMILY ); |
| } |
| |
| |
| inline bool hasStatementGuardFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_GUARD_FAMILY) != 0 ); |
| } |
| |
| inline bool hasStatementInputFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_INPUT_ANY_FAMILY) != 0 ); |
| } |
| |
| inline bool hasStatementOutputFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_OUTPUT_ANY_FAMILY) != 0 ); |
| } |
| |
| inline bool hasStatementComFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_COM_ANY_FAMILY) != 0 ); |
| } |
| |
| |
| inline bool hasConditionalStatementFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_CONDIONAL_CLASS) != 0 ); |
| } |
| |
| inline bool hasConditionalComStatementFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_COM_CONDITIONAL_CLASS) != 0 ); |
| } |
| |
| inline bool isGuardConditionalStatementFamily() const |
| { |
| return( (theStatementFamily & (~ (AVM_STATEMENT_UNCONDIONAL_CLASS | |
| AVM_STATEMENT_GUARD_FAMILY)) ) == 0 ); |
| } |
| |
| |
| inline bool hasUnconditionalStatementFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_UNCONDIONAL_CLASS) != 0 ); |
| } |
| |
| inline bool isUnconditionalStatementFamily() const |
| { |
| return( (theStatementFamily & (~ AVM_STATEMENT_UNCONDIONAL_CLASS)) == 0 ); |
| } |
| |
| |
| inline bool hasUnconditionalComStatementFamily() const |
| { |
| return( (theStatementFamily & AVM_STATEMENT_COM_ENV_FAMILY) != 0 ); |
| } |
| |
| inline bool isUnconditionalComStatementFamily() const |
| { |
| return( (theStatementFamily & (~ (AVM_STATEMENT_COM_ENV_FAMILY | |
| AVM_STATEMENT_BASIC_FAMILY))) == 0 ); |
| } |
| |
| |
| /** |
| * Serialization |
| */ |
| std::string strStatementFamily( |
| avm_opcode_family mask = AVM_STATEMENT_MASK_ALL_FAMILY) const; |
| |
| }; |
| |
| |
| } |
| |
| #endif /* OPERATORLIB_H_ */ |