public LuaValue NextKey(LuaValue key) { if (_keys == null || key.IsNil() && _changed) { InitKeys(); _changed = false; } var nextKey = LuaValue.Nil; if (key.IsNil()) { nextKey = _keys[KeysHead]; } else if (_keys.ContainsKey(key.GetValue())) { nextKey = _keys[key.GetValue()]; } if (nextKey.IsNil() && key.GetValue() != null && key.GetValue() != _lastKey) { Debug.Panic("invalid key to 'next'"); } return(nextKey); }
private bool Eq(LuaValue a, LuaValue b, LuaState ls) { if (a.IsNil()) { return(b.IsNil()); } else if (a.IsBool()) { return(b.IsBool() && a.GetBoolValue() == b.GetBoolValue()); } else if (a.IsString()) { return(b.IsString() && a.GetStrValue() == b.GetStrValue()); } else if (a.IsInt()) { if (b.IsInt()) { return(a.GetIntValue() == b.GetIntValue()); } else if (b.IsFloat()) { return(a.GetIntValue() == b.GetFloatValue()); } else { return(false); } } else if (a.IsFloat()) { if (b.IsFloat()) { return(a.GetFloatValue() == b.GetFloatValue()); } else if (b.IsInt()) { return(a.GetFloatValue() == b.GetIntValue()); } else { return(false); } } else if (a.IsTable() && b.IsTable() && a.GetTableValue() != b.GetTableValue() && ls != null) { if (LuaValue.CallMetaMethod(a, b, "__eq", ls, out var metaMethodRet)) { return(metaMethodRet.ToBoolean()); } return(a.GetValue() == b.GetValue()); } else { return(a.GetValue() == b.GetValue()); } }
private void InitKeys() { _keys = new Dictionary <object, LuaValue>(); object key = KeysHead; if (_arr != null) { for (var i = 0; i < _arr.Count; i++) { var value = _arr[i]; if (value.GetValue() != null) { var newValue = new LuaValue((LuaInt)(i + 1)); ; _keys.Add(key, newValue); key = newValue.GetValue(); } } } if (_map != null) { foreach (var kv in _map) { if (kv.Value != null) { var value = LuaValue.Create(kv.Key); _keys.Add(key, value); key = value.GetValue(); } } } _lastKey = key; }
public LuaValue Get(LuaValue key) { LuaInt idx = 0; if (key.IsInt()) { idx = key.GetIntValue(); } else if (key.IsFloat()) { if (LuaMath.FloatToInteger(key.GetFloatValue(), out var fi)) { idx = fi; } } if (idx >= 1 && idx <= Len()) { return(_arr[(int)(idx - 1)]); } return(_map != null && _map.TryGetValue(key.GetValue(), out var ret) ? ret : LuaValue.Nil); }
public void Put(LuaValue key, LuaValue val) { if (key is null || key.IsNil()) { Debug.Panic("table index is nil!"); } if (key.IsFloat() && LuaFloat.IsNaN(key.GetFloatValue())) { Debug.Panic("table index is Nan!"); } _changed = true; LuaInt idx = 0; if (key.IsInt()) { idx = key.GetIntValue(); } else if (key.IsFloat()) { if (LuaMath.FloatToInteger(key.GetFloatValue(), out var fi)) { idx = fi; } } if (idx >= 1) { var arrLen = Len(); if (idx <= arrLen) { _arr[(int)(idx - 1)] = val; if (idx == arrLen && val.IsNil()) { ShrinkArray(); } return; } if (idx == arrLen + 1) { if (_map != null && _map.ContainsKey(key.GetIntValue())) { _map.Remove(key.GetIntValue()); } if (!val.IsNil()) { if (_arr == null) { _arr = new List <LuaValue>(); } _arr.Add(val); ExpandArray(); } return; } } if (!val.IsNil()) { if (_map == null) { _map = new Dictionary <object, LuaValue>(); } _map[key.GetValue()] = val; } else { _map.Remove(key.GetValue()); } }