Add Support for Sar Changes Detection ...

This commit is contained in:
2024-12-10 01:38:29 +03:30
parent 812e468151
commit b5cec1f52a
4 changed files with 453 additions and 119 deletions
+182
View File
@@ -1839,4 +1839,186 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
return result;
}
//
// Model Value Changed ...
struct XValueChange
{
//
// Props ...
double before; // Before Change Value ...
double after; // After Change Value ...
datetime time; // Change Time ...
ENUM_X_DIRECTION dir; // Change Direction ...
//
// Constructor ...
XValueChange()
{
Clean();
}
//
// Tools ...
/**
* Initialize ...
*
* @param _before: Double, Value Before Change ...
* @param _after: Double, Value After Change ...
* @param _time: Datetime, Change Time ...
* @param _dir: ENUM_X_DIRECTION member, Specified Changed Direction ...
*
* @return ( bool )
*/
bool Init(
double _before, // Before Change Value ...
double _after, // After Change Value ...
ENUM_X_DIRECTION _dir, // Change Direction ...
datetime _time = NULL // Change Time ...
)
{
//
bool result = false;
//
_time = NormalizeTime(_time);
//
// Validate Inputs ...
result =
//
_after > 0 &&
_before > 0 &&
IsValid(_time) &&
_after != _before &&
HasDirection(_dir)
//
;
if (!result)
{
return result;
}
//
// Set Validated Values ...
dir = _dir;
time = _time;
after = _after;
before = _before;
//
result = IsValid();
//
return result;
}
/**
* Cleaning Up ...
*/
void Clean()
{
//
after = 0;
before = 0;
time = NULL;
dir = X_DIRECTION_NONE;
}
/**
* Validate Model ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
after > 0 &&
before > 0 &&
IsValid(time) &&
after != before &&
HasDirection(dir)
//
;
//
return result;
}
//
};
/**
* Add Value Change instance to Exists Collection if it's not Exists ...
*
* @param item: XValueChange instance Reference ...
* @param items: XValueChange instance Array Reference ...
*
* @return ( int )
*/
int AddIfNotExists(
XValueChange &item,
XValueChange &items[] //
)
{
//
int result = 0;
//
result = item.IsValid();
if (!result)
{
return result;
}
//
bool canAdd = false;
int count = ArraySize(items);
if (!IsValidSize(count))
{
canAdd = true;
}
else
{
//
XValueChange last;
bool hasItem = GetLastItem(
last,
items //
);
if (!hasItem)
{
canAdd = true;
}
else
{
//
// Compare Last Item with Current ...
canAdd = item.time > last.time;
}
}
//
// Add Item if Allowed ...
if (canAdd)
{
//
AddRef(
item,
items //
);
}
//
result = ArraySize(items);
//
return result;
}
//