From 13ffc07f2786c7a7fdd97b296968e88dfa04c636 Mon Sep 17 00:00:00 2001 From: mharis001 <34453221+mharis001@users.noreply.github.com> Date: Mon, 7 Oct 2019 20:41:46 -0400 Subject: [PATCH] Common - Optimize arithmeticGetResult function (#7232) * Optimize arithmeticGetResult * Add element to default array, safer function Co-Authored-By: PabstMirror --- .../functions/fnc_arithmeticGetResult.sqf | 67 +++++++++---------- .../functions/fnc_arithmeticSetSource.sqf | 6 +- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/addons/common/functions/fnc_arithmeticGetResult.sqf b/addons/common/functions/fnc_arithmeticGetResult.sqf index e54f44fd27f..ea5c2f3897a 100644 --- a/addons/common/functions/fnc_arithmeticGetResult.sqf +++ b/addons/common/functions/fnc_arithmeticGetResult.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Gets arithmetic result from a set. + * Returns the arithmetic result of performing the given operation on a set. * * Arguments: - * 0: Namespace + * 0: Namespace * 1: Number Set ID - * 2: Operation (sum, product, min, max, avg) (Case Sensitive) + * 2: Operation (max, min, sum, product, avg) (Case Sensitive) * * Return Value: * Value @@ -18,51 +18,44 @@ * Public: Yes */ -params ["_namespace", "_setID", "_op"]; -TRACE_3("arithmeticGetResult",_namespace,_setID,_op); +params ["_namespace", "_setID", "_operation"]; +TRACE_3("arithmeticGetResult",_namespace,_setID,_operation); -private _data = (_namespace getVariable _setID) param [2, []]; +private _data = (_namespace getVariable _setID) param [2, [{0}]]; -switch (_op) do { - case ("max"): { - private _result = -1e99; - { - _result = _result max (call _x); - nil - } count _data; - _result // return +switch (_operation) do { + case "max": { + selectMax (_data apply {call _x}) + }; + case "min": { + selectMin (_data apply {call _x}) }; - case ("sum"): { + case "sum": { private _result = 0; + { - _result = _result + (call _x); - nil - } count _data; - _result // return + _result = _result + call _x; + } forEach _data; + + _result }; - case ("product"): { + case "product": { private _result = 1; + { - _result = _result * (call _x); - nil - } count _data; - _result // return - }; - case ("min"): { - private _result = 1e99; - { - _result = _result min (call _x); - nil - } count _data; - _result // return + _result = _result * call _x; + } forEach _data; + + _result }; - case ("avg"): { + case "avg": { private _result = 0; + { - _result = _result + (call _x); - nil - } count _data; - _result / (count _data); // return + _result = _result + call _x; + } forEach _data; + + _result / count _data }; default {3735928559}; }; diff --git a/addons/common/functions/fnc_arithmeticSetSource.sqf b/addons/common/functions/fnc_arithmeticSetSource.sqf index 0d7503aa90e..ce24c408efe 100644 --- a/addons/common/functions/fnc_arithmeticSetSource.sqf +++ b/addons/common/functions/fnc_arithmeticSetSource.sqf @@ -4,7 +4,7 @@ * Adds or removes a source to an arithmetic set. * * Arguments: - * 0: Namespace + * 0: Namespace * 1: Number Set ID * 2: Source * 3: Code that returns a number (can access var _namespace) [use {} to remove] @@ -20,13 +20,15 @@ */ params ["_namespace", "_setID", "_source", "_variable"]; -TRACE_4("params",_namespace,_setID,_source,_variable); +TRACE_4("arithmeticSetSource",_namespace,_setID,_source,_variable); private _hash = _namespace getVariable _setID; + if (isNil "_hash") then { _hash = [] call CBA_fnc_hashCreate; _namespace setVariable [_setID, _hash]; }; + if (_variable isEqualTo {}) then { TRACE_1("removing",_source); [_hash, _source] call CBA_fnc_hashRem;