示例#1
0
        /// <summary>
        /// Attempts to parse a modification.
        /// </summary>
        static public bool TryParse(StringSlice inData, out VariantModification outModification)
        {
            inData = inData.Trim();

            VariantModifyOperator op = default(VariantModifyOperator);
            int operatorIdx          = -1;
            int operatorLength       = 0;

            VariantUtils.TryFindOperator(inData, '=', VariantModifyOperator.Set, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '+', VariantModifyOperator.Add, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '-', VariantModifyOperator.Subtract, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '*', VariantModifyOperator.Multiply, ref operatorIdx, ref op, ref operatorLength);
            VariantUtils.TryFindOperator(inData, '/', VariantModifyOperator.Divide, ref operatorIdx, ref op, ref operatorLength);

            if (operatorIdx < 0)
            {
                outModification = default(VariantModification);
                return(false);
            }

            outModification.Operator = op;

            StringSlice key     = inData.Substring(0, operatorIdx);
            StringSlice operand = inData.Substring(operatorIdx + 1);

            if (!TableKeyPair.TryParse(key, out outModification.VariableKey))
            {
                outModification = default(VariantModification);
                return(false);
            }

            return(VariantOperand.TryParse(operand, out outModification.Operand));
        }
示例#2
0
        /// <summary>
        /// Attempts to parse data into an operand.
        /// </summary>
        static public bool TryParse(StringSlice inData, out VariantOperand outOperand)
        {
            Variant value;

            if (Variant.TryParse(inData, out value))
            {
                outOperand = new VariantOperand(value);
                return(true);
            }

            TableKeyPair tableKey;

            if (TableKeyPair.TryParse(inData, out tableKey))
            {
                outOperand = new VariantOperand(tableKey);
                return(true);
            }

            MethodCall call;

            if (MethodCall.TryParse(inData, out call))
            {
                outOperand = new VariantOperand(call);
                return(true);
            }

            outOperand = default(VariantOperand);
            return(false);
        }
 /// <summary>
 /// Removes variable lookup for the given key.
 /// </summary>
 public CustomVariantResolver ClearVar(TableKeyPair inKey)
 {
     if (m_FullPathVarLookup != null)
     {
         m_FullPathVarLookup.Remove(inKey);
         m_HasSpecialVariantLookups = CalculateHasSpecialVariants();
     }
     return(this);
 }
        /// <summary>
        /// Uses a delegate to return a value for the given key.
        /// </summary>
        public CustomVariantResolver SetVar(TableKeyPair inKey, GetVarWithContextDelegate inGetter)
        {
            if (inGetter == null)
            {
                throw new ArgumentNullException("inGetter");
            }

            MakeFullPathVarRule(inKey).SetDelegate(inGetter);
            return(this);
        }
        /// <summary>
        /// Sets up a remap between two full table keys.
        /// </summary>
        public CustomVariantResolver RemapFullKey(TableKeyPair inKey, TableKeyPair inRemap)
        {
            m_HasRemaps = true;
            if (m_FullKeyRemap == null)
            {
                m_FullKeyRemap = new Dictionary <TableKeyPair, TableKeyPair>();
            }

            m_FullKeyRemap[inKey] = inRemap;
            return(this);
        }
        public bool TryGetVariant(object inContext, TableKeyPair inKey, out Variant outVariant)
        {
            if (m_HasSpecialVariantLookups)
            {
                if (m_FullPathVarLookup != null)
                {
                    FullPathVarRule rule;
                    if (m_FullPathVarLookup.TryGetValue(inKey, out rule))
                    {
                        outVariant = rule.Resolve(inContext);
                        return(true);
                    }
                }

                if (m_TableVarLookup != null)
                {
                    TableVarRule rule;
                    if (m_TableVarLookup.TryGetValue(inKey.TableId, out rule))
                    {
                        outVariant = rule.Resolve(inKey.VariableId, inContext);
                        return(true);
                    }
                }

                if (m_GetVarWithContextFallback != null)
                {
                    outVariant = m_GetVarWithContextFallback(inKey, inContext);
                    return(true);
                }

                if (m_GetVarFallback != null)
                {
                    outVariant = m_GetVarFallback(inKey);
                    return(true);
                }
            }

            VariantTable table;

            if (InternalTryGetTable(inContext, inKey.TableId, out table, false))
            {
                return(table.TryLookup(inKey.VariableId, out outVariant));
            }

            if (m_Base != null)
            {
                return(m_Base.TryGetVariant(inContext, inKey, out outVariant));
            }

            outVariant = Variant.Null;
            return(false);
        }
        public void RemapKey(ref TableKeyPair ioKey)
        {
            if (m_HasRemaps)
            {
                if (m_FullKeyRemap != null)
                {
                    TableKeyPair fullRemap;
                    if (m_FullKeyRemap.TryGetValue(ioKey, out fullRemap))
                    {
                        ioKey = fullRemap;
                        return;
                    }
                }

                if (m_TableIdRemap != null)
                {
                    StringHash32 tableRemap;
                    if (m_TableIdRemap.TryGetValue(ioKey.TableId, out tableRemap))
                    {
                        ioKey.TableId = tableRemap;
                    }
                }

                if (m_VariableIdRemap != null)
                {
                    StringHash32 varRemap;
                    if (m_VariableIdRemap.TryGetValue(ioKey.TableId, out varRemap))
                    {
                        ioKey.VariableId = varRemap;
                    }
                }
            }

            if (m_Base != null)
            {
                m_Base.RemapKey(ref ioKey);
            }
        }
        private FullPathVarRule MakeFullPathVarRule(TableKeyPair inKey)
        {
            FullPathVarRule rule;

            if (m_FullPathVarLookup == null)
            {
                m_FullPathVarLookup = new Dictionary <TableKeyPair, FullPathVarRule>();
                rule = null;
                m_HasSpecialVariantLookups = true;
            }
            else
            {
                m_FullPathVarLookup.TryGetValue(inKey, out rule);
            }

            if (rule == null)
            {
                rule = new FullPathVarRule();
                m_FullPathVarLookup.Add(inKey, rule);
            }

            return(rule);
        }
示例#9
0
        /// <summary>
        /// Attempts to apply a modification.
        /// </summary>
        static public bool TryModify(this IVariantResolver inResolver, object inContext, TableKeyPair inKey, VariantModifyOperator inOperator, Variant inVariant)
        {
            inResolver.RemapKey(ref inKey);

            VariantTable table;
            bool         bRetrieved = inResolver.TryGetTable(inContext, inKey.TableId, out table);

            if (!bRetrieved || table == null)
            {
                UnityEngine.Debug.LogErrorFormat("[IVariantResolver] Unable to retrieve table with id '{0}'", inKey.TableId.ToDebugString());
                return(false);
            }

            table.Modify(inKey.VariableId, inOperator, inVariant);
            return(true);
        }
示例#10
0
        /// <summary>
        /// Attempts to resolve a variable.
        /// </summary>
        static public bool TryResolve(this IVariantResolver inResolver, object inContext, TableKeyPair inKey, out Variant outVariant)
        {
            inResolver.RemapKey(ref inKey);

            bool bRetrieved = inResolver.TryGetVariant(inContext, inKey, out outVariant);

            if (bRetrieved)
            {
                return(true);
            }

            VariantTable table;
            bool         bFoundTable = inResolver.TryGetTable(inContext, inKey.TableId, out table);

            if (!bFoundTable || table == null)
            {
                UnityEngine.Debug.LogErrorFormat("[IVariantResolver] Unable to retrieve table with id '{0}'", inKey.TableId.ToDebugString());
                outVariant = Variant.Null;
                return(false);
            }

            return(table.TryLookup(inKey.VariableId, out outVariant));
        }
示例#11
0
 public VariantOperand(TableKeyPair inKey)
     : this(Mode.TableKey)
 {
     m_Data.TableKey = inKey;
 }
示例#12
0
 /// <summary>
 /// Sets the value associated with the given key.
 /// </summary>
 public CustomVariantResolver SetVar(TableKeyPair inKey, Variant inValue)
 {
     MakeFullPathVarRule(inKey).SetConst(inValue);
     return(this);
 }