Class EmptyOperatorTable

  • All Implemented Interfaces:
    JepComponent, OperatorTableI, java.io.Serializable
    Direct Known Subclasses:
    OperatorTable2

    public class EmptyOperatorTable
    extends java.lang.Object
    implements OperatorTableI
    A base class for operator tables, this class has no pre-defined operators. For most cases its subclass OperatorTable2 should be used which has the standard set of operators.

    This class has a sub-interface OperatorKey which is used to index operators, enums using this are defined in OperatorTable2.

    Since:
    3.4
    Author:
    Richard Morris
    See Also:
    Serialized Form
    • Constructor Detail

      • EmptyOperatorTable

        public EmptyOperatorTable()
        Constructor with an empty map.
      • EmptyOperatorTable

        protected EmptyOperatorTable​(java.util.Map<EmptyOperatorTable.OperatorKey,​Operator> oldMap)
        Constructor with a specified map. Subclasses should define similar constructors to allow the shallowCopy() to work.
        Parameters:
        oldMap - map with existing set of functions
        Since:
        4.0
    • Method Detail

      • init

        public void init​(Jep jep)
        Description copied from interface: JepComponent
        Initialize the component. This methods is called whenever a component is added to Jep. Hence it allows components to keep track of the other components they may rely on.
        Specified by:
        init in interface JepComponent
        Parameters:
        jep - the current Jep instance
      • getNumOps

        public int getNumOps()
      • addOperator

        public Operator addOperator​(EmptyOperatorTable.OperatorKey key,
                                    Operator op,
                                    Operator existingOp)
        Add operator with the same precedence level as an existing operator.
        Parameters:
        key - unique key used to identify the operator.
        op - the new operator
        existingOp - and existing operator, the precedence of this operator will be the same as the existing operator.
        Returns:
        the operator
      • addOperator

        public Operator addOperator​(Operator op,
                                    Operator existingOp)
        Add operator with the same precedence level as an existing operator. The key will be automatically generated and it can be recovered using getKey(Operator).
        Parameters:
        op - the new operator
        existingOp - and existing operator, the precedence of this operator will be the same as the existing operator.
        Returns:
        the operator
      • insertOperator

        public Operator insertOperator​(EmptyOperatorTable.OperatorKey key,
                                       Operator op,
                                       Operator existingOp)
        Add an operator with a new precedence level which is equal to the existing op. Increments the precedence of the existing operator all operators with a greater or equal precedence by one.
        Parameters:
        key - a key used to identify the operator
        op -
        existingOp -
        Returns:
        the operator
      • insertOperator

        public Operator insertOperator​(Operator op,
                                       Operator existingOp)
        Add an operator with a new precedence level which is equal to the existing op. Increments the precedence of the existing operator all operators with a greater or equal precedence by one. The key will be automatically generated and it can be recovered using getKey(Operator).
        Parameters:
        op -
        existingOp -
        Returns:
        the operator
      • appendOperator

        public Operator appendOperator​(EmptyOperatorTable.OperatorKey key,
                                       Operator op,
                                       Operator existingOp)
        Add an operator with a new precedence level which is lower than the existing op. Increments the precedence of all operators with a greater precedence by one.
        Parameters:
        key -
        op -
        existingOp -
        Returns:
        the operator
      • appendOperator

        public Operator appendOperator​(Operator op,
                                       Operator existingOp)
        Add an operator with a new precedence level which is lower than the existing op. Increments the precedence of all operators with a greater precedence by one. The key will be automatically generated and it can be recovered using getKey(Operator).
        Parameters:
        op - Operator to add
        existingOp - operator to copy precedence from
        Returns:
        the operator
      • removeOperator

        public void removeOperator​(Operator op)
        Remove a give operator from the table
        Parameters:
        op -
      • replaceOperator

        public void replaceOperator​(Operator oldOp,
                                    Operator op)
        Replace a give operator with a new one. The new operator will have the same precedence as the old one
        Parameters:
        oldOp - the operator to be replaced
        op - the new operator
      • replaceOperator

        public void replaceOperator​(EmptyOperatorTable.OperatorKey key,
                                    Operator op)
        Replace a give operator with a new one. The new operator will have the same precedence as the old one
        Parameters:
        key - the key for the operator
        op - the new operator
      • getOperator

        public Operator getOperator​(EmptyOperatorTable.OperatorKey key)
        Get operator by its key code. Most efficient way to get an operator.
        Parameters:
        key - code used in the table
        Returns:
        the operator or null if not found
      • getOperatorsBySymbol

        public java.util.List<Operator> getOperatorsBySymbol​(java.lang.String symbol)
        Gets all the operators with a given symbol
        Specified by:
        getOperatorsBySymbol in interface OperatorTableI
        Parameters:
        symbol - symbol used for operator
        Returns:
        list of operators with a given symbol, empty list if none are found.
      • getOperatorsByName

        public Operator getOperatorsByName​(java.lang.String name)
        Get the operator with a given name
        Specified by:
        getOperatorsByName in interface OperatorTableI
        Parameters:
        name - unique name of operator
        Returns:
        the operator or null if not found
      • setPrecedenceTable

        public final boolean setPrecedenceTable​(EmptyOperatorTable.OperatorKey[][] precArray)
        Sets the precedence of all operators at one time. An array of arrays of key codes of operators is used to set the table operators with the same precedence are grouped together and listed from tighter binding to loose binding. For example
         setPrecedenceTable(new OperatorKey[][] { { POWER }, { NEG, UPLUS, NOT }, { MUL, DIV, MOD, DOT, CROSS },
                        { ADD, SU }, { LT, LE, GT, GE }, { EQ, NE }, { AND }, { OR }, { ASSIGN }, });
         
        Parameters:
        precArray -
        Returns:
        flag
      • setGroupOperatorRelations

        protected void setGroupOperatorRelations​(Operator root,
                                                 Operator inv,
                                                 Operator composite)
        Sets relations of three operators. A mathematical group has three related operators the root operator x+y, the inverse uminus z, and composite x-y = x+(uminus y)
        Parameters:
        root - the root operator i.e. ADD
        inv - the inverse operator i.e. UMINUS
        composite - the composite operator i.e. SUBTRACT
      • setGroupOperatorRelations

        protected void setGroupOperatorRelations​(EmptyOperatorTable.OperatorKey root,
                                                 EmptyOperatorTable.OperatorKey inv,
                                                 EmptyOperatorTable.OperatorKey composite)
        Sets relations of three operators. A mathematical group has three related operators the root operator x+y, the inverse uminus z, and composite x-y = x+(uminus y)
        Parameters:
        root - the root operator i.e. ADD
        inv - the inverse operator i.e. UMINUS
        composite - the composite operator i.e. SUBTRACT
      • setStandardOperatorRelations

        protected void setStandardOperatorRelations()
        Sets up the standard relations between +,-,*,/
      • toString

        public java.lang.String toString()
        String rep operators ordered by precedence, one per line.
        Overrides:
        toString in class java.lang.Object
      • shallowCopy

        public OperatorTableI shallowCopy()
        Create a new version of this OperatorTable. Operators are copied into new table. However Operators whose pfmc implement JepComponent are duplicated. This means the table could be used in a separate thread without problem. Subclasses should override with method to return a table of the correct type, a typical implementation would be
            @Override
            public OperatorTableI shallowCopy() {
                Map<OperatorKey, Operator> map = this.threadSafeMapCopy();
                return new MyOperatorTable(map);
            }
         
        using the threadSafeMapCopy() method to return a copy of the map of operators and a constructor taking this map which uses the EmptyOperatorTable(Map) constructor.
        Specified by:
        shallowCopy in interface OperatorTableI
        Returns:
        a new Table
      • threadSafeMapCopy

        protected java.util.Map<EmptyOperatorTable.OperatorKey,​Operator> threadSafeMapCopy()
        Creates a copy of the internal map used for operators. Most operators are simply copied to the new table. However Operators whose pfmc's implement JepComponent are duplicated, this means the table could be used in multiple threads without problem.
        Returns:
        a new map with one entry for each each operator in the current table.