1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-21 20:27:13 +01:00

Implement algorithms for name filtering.

This commit is contained in:
Sandu Liviu Catalin 2016-08-19 03:49:50 +03:00
parent 59b0d20f08
commit 4d3561d048
2 changed files with 204 additions and 0 deletions

View File

@ -206,6 +206,24 @@ static inline Array Player_AllWhereNameContains(bool neg, bool cs, CSStr name)
return Var< Array >(DefaultVM::Get(), -1).value; return Var< Array >(DefaultVM::Get(), -1).value;
} }
/* ------------------------------------------------------------------------------------------------
* Collect all players where the name matches or not the specified filter.
*/
static inline Array Player_AllWhereNameMatches(bool neg, bool cs, CSStr name)
{
SQMOD_VALID_NAME_STR(name)
// Remember the current stack size
const StackGuard sg;
// Allocate an empty array on the stack
sq_newarray(DefaultVM::Get(), 0);
// Process each entity in the pool
EachMatches(InstSpec< CPlayer >::CBegin(), InstSpec< CPlayer >::CEnd(),
ValidInstFunc< CPlayer >(), PlayerName(),
AppendElemFunc< CPlayer >(), name, !neg, cs);
// Return the array at the top of the stack
return Var< Array >(DefaultVM::Get(), -1).value;
}
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* Retrieve the first player where the name matches or not the specified one. * Retrieve the first player where the name matches or not the specified one.
*/ */
@ -270,6 +288,22 @@ static inline Object Player_FirstWhereNameContains(bool neg, bool cs, CSStr name
return recv.mObj; return recv.mObj;
} }
/* ------------------------------------------------------------------------------------------------
* Retrieve the first player where the name matches or not the specified filter.
*/
static inline Object Player_FirstWhereNameMatches(bool neg, bool cs, CSStr name)
{
SQMOD_VALID_NAME_STR(name)
// Create a new element receiver
RecvElemFunc< CPlayer > recv;
// Process each entity in the pool
FirstMatches(InstSpec< CPlayer >::CBegin(), InstSpec< CPlayer >::CEnd(),
ValidInstFunc< CPlayer >(), PlayerName(),
std::reference_wrapper< RecvElemFunc< CPlayer > >(recv), name, !neg, cs);
// Return the received element, if any
return recv.mObj;
}
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Process all entities of this type where the name matches or not the specified one. * Process all entities of this type where the name matches or not the specified one.
*/ */
@ -334,6 +368,22 @@ static inline Uint32 Player_EachWhereNameContains(bool neg, bool cs, CSStr name,
return fwd.mCount; return fwd.mCount;
} }
/* --------------------------------------------------------------------------------------------
* Process all entities of this type where the name matches the specified filter.
*/
static inline Uint32 Player_EachWhereNameMatches(bool neg, bool cs, CSStr name, Object & env, Function & func)
{
SQMOD_VALID_NAME_STR(name)
// Create a new element forwarder
ForwardElemFunc< CPlayer > fwd(env, func);
// Process each entity in the pool
EachMatches(InstSpec< CPlayer >::CBegin(), InstSpec< CPlayer >::CEnd(),
ValidInstFunc< CPlayer >(), PlayerName(),
std::reference_wrapper< ForwardElemFunc< CPlayer > >(fwd), name, !neg, cs);
// Return the forward count
return fwd.mCount;
}
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Count all entities of this type where the name matches or not the specified one. * Count all entities of this type where the name matches or not the specified one.
*/ */
@ -398,6 +448,22 @@ static inline Uint32 Player_CountWhereNameContains(bool neg, bool cs, CSStr name
return cnt; return cnt;
} }
/* --------------------------------------------------------------------------------------------
* Count all entities of this type where the name matches the specified filter.
*/
static inline Uint32 Player_CountWhereNameMatches(bool neg, bool cs, CSStr name)
{
SQMOD_VALID_NAME_STR(name)
// Create a new element counter
CountElemFunc< CPlayer > cnt;
// Process each entity in the pool
EachMatches(InstSpec< CPlayer >::CBegin(), InstSpec< CPlayer >::CEnd(),
ValidInstFunc< CPlayer >(), PlayerName(),
std::reference_wrapper< CountElemFunc< CPlayer > >(cnt), name, !neg, cs);
// Return the count
return cnt;
}
// ================================================================================================ // ================================================================================================
void Register(HSQUIRRELVM vm) void Register(HSQUIRRELVM vm)
{ {
@ -409,6 +475,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CBlip >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CBlip >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CBlip >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CBlip >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CBlip >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CBlip >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CBlip >::AllWhereTagMatches)
); );
collect_ns.Bind(_SC("Checkpoint"), Table(vm) collect_ns.Bind(_SC("Checkpoint"), Table(vm)
@ -417,6 +484,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CCheckpoint >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CCheckpoint >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CCheckpoint >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CCheckpoint >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CCheckpoint >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CCheckpoint >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CCheckpoint >::AllWhereTagMatches)
); );
collect_ns.Bind(_SC("Keybind"), Table(vm) collect_ns.Bind(_SC("Keybind"), Table(vm)
@ -425,6 +493,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CKeybind >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CKeybind >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CKeybind >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CKeybind >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CKeybind >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CKeybind >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CKeybind >::AllWhereTagMatches)
); );
collect_ns.Bind(_SC("Object"), Table(vm) collect_ns.Bind(_SC("Object"), Table(vm)
@ -433,6 +502,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CObject >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CObject >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CObject >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CObject >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CObject >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CObject >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CObject >::AllWhereTagMatches)
); );
collect_ns.Bind(_SC("Pickup"), Table(vm) collect_ns.Bind(_SC("Pickup"), Table(vm)
@ -441,6 +511,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPickup >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPickup >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPickup >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPickup >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPickup >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CPickup >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPickup >::AllWhereTagMatches)
); );
collect_ns.Bind(_SC("Player"), Table(vm) collect_ns.Bind(_SC("Player"), Table(vm)
@ -449,10 +520,12 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPlayer >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPlayer >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPlayer >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPlayer >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPlayer >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CPlayer >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPlayer >::AllWhereTagMatches)
.Func(_SC("NameEquals"), &Player_AllWhereNameEquals) .Func(_SC("NameEquals"), &Player_AllWhereNameEquals)
.Func(_SC("NameBegins"), &Player_AllWhereNameBegins) .Func(_SC("NameBegins"), &Player_AllWhereNameBegins)
.Func(_SC("NameEnds"), &Player_AllWhereNameEnds) .Func(_SC("NameEnds"), &Player_AllWhereNameEnds)
.Func(_SC("NameContains"), &Player_AllWhereNameContains) .Func(_SC("NameContains"), &Player_AllWhereNameContains)
.Func(_SC("NameMatches"), &Player_AllWhereNameMatches)
); );
collect_ns.Bind(_SC("Vehicle"), Table(vm) collect_ns.Bind(_SC("Vehicle"), Table(vm)
@ -461,6 +534,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CVehicle >::AllWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CVehicle >::AllWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CVehicle >::AllWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CVehicle >::AllWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CVehicle >::AllWhereTagContains) .Func(_SC("TagContains"), &Entity< CVehicle >::AllWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CVehicle >::AllWhereTagMatches)
); );
RootTable(vm).Bind(_SC("SqCollect"), collect_ns); RootTable(vm).Bind(_SC("SqCollect"), collect_ns);
@ -473,6 +547,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CBlip >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CBlip >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CBlip >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CBlip >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CBlip >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CBlip >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CBlip >::FirstWhereTagMatches)
.Func(_SC("WithSprID"), &Blip_FindBySprID) .Func(_SC("WithSprID"), &Blip_FindBySprID)
); );
@ -482,6 +557,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CCheckpoint >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CCheckpoint >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CCheckpoint >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CCheckpoint >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CCheckpoint >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CCheckpoint >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CCheckpoint >::FirstWhereTagMatches)
); );
find_ns.Bind(_SC("Keybind"), Table(vm) find_ns.Bind(_SC("Keybind"), Table(vm)
@ -490,6 +566,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CKeybind >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CKeybind >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CKeybind >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CKeybind >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CKeybind >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CKeybind >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CKeybind >::FirstWhereTagMatches)
); );
find_ns.Bind(_SC("Object"), Table(vm) find_ns.Bind(_SC("Object"), Table(vm)
@ -498,6 +575,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CObject >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CObject >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CObject >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CObject >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CObject >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CObject >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CObject >::FirstWhereTagMatches)
); );
find_ns.Bind(_SC("Pickup"), Table(vm) find_ns.Bind(_SC("Pickup"), Table(vm)
@ -506,6 +584,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPickup >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPickup >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPickup >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPickup >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPickup >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CPickup >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPickup >::FirstWhereTagMatches)
); );
find_ns.Bind(_SC("Player"), Table(vm) find_ns.Bind(_SC("Player"), Table(vm)
@ -514,10 +593,12 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPlayer >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPlayer >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPlayer >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPlayer >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPlayer >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CPlayer >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPlayer >::FirstWhereTagMatches)
.Func(_SC("NameEquals"), &Player_FirstWhereNameEquals) .Func(_SC("NameEquals"), &Player_FirstWhereNameEquals)
.Func(_SC("NameBegins"), &Player_FirstWhereNameBegins) .Func(_SC("NameBegins"), &Player_FirstWhereNameBegins)
.Func(_SC("NameEnds"), &Player_FirstWhereNameEnds) .Func(_SC("NameEnds"), &Player_FirstWhereNameEnds)
.Func(_SC("NameContains"), &Player_FirstWhereNameContains) .Func(_SC("NameContains"), &Player_FirstWhereNameContains)
.Func(_SC("NameMatches"), &Player_FirstWhereNameMatches)
); );
find_ns.Bind(_SC("Vehicle"), Table(vm) find_ns.Bind(_SC("Vehicle"), Table(vm)
@ -526,6 +607,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CVehicle >::FirstWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CVehicle >::FirstWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CVehicle >::FirstWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CVehicle >::FirstWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CVehicle >::FirstWhereTagContains) .Func(_SC("TagContains"), &Entity< CVehicle >::FirstWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CVehicle >::FirstWhereTagMatches)
); );
RootTable(vm).Bind(_SC("SqFind"), find_ns); RootTable(vm).Bind(_SC("SqFind"), find_ns);
@ -538,6 +620,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CBlip >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CBlip >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CBlip >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CBlip >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CBlip >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CBlip >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CBlip >::EachWhereTagMatches)
); );
each_ns.Bind(_SC("Checkpoint"), Table(vm) each_ns.Bind(_SC("Checkpoint"), Table(vm)
@ -546,6 +629,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CCheckpoint >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CCheckpoint >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CCheckpoint >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CCheckpoint >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CCheckpoint >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CCheckpoint >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CCheckpoint >::EachWhereTagMatches)
); );
each_ns.Bind(_SC("Keybind"), Table(vm) each_ns.Bind(_SC("Keybind"), Table(vm)
@ -554,6 +638,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CKeybind >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CKeybind >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CKeybind >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CKeybind >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CKeybind >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CKeybind >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CKeybind >::EachWhereTagMatches)
); );
each_ns.Bind(_SC("Object"), Table(vm) each_ns.Bind(_SC("Object"), Table(vm)
@ -562,6 +647,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CObject >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CObject >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CObject >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CObject >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CObject >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CObject >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CObject >::EachWhereTagMatches)
); );
each_ns.Bind(_SC("Pickup"), Table(vm) each_ns.Bind(_SC("Pickup"), Table(vm)
@ -570,6 +656,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPickup >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPickup >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPickup >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPickup >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPickup >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CPickup >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPickup >::EachWhereTagMatches)
); );
each_ns.Bind(_SC("Player"), Table(vm) each_ns.Bind(_SC("Player"), Table(vm)
@ -578,10 +665,12 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPlayer >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPlayer >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPlayer >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPlayer >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPlayer >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CPlayer >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPlayer >::EachWhereTagMatches)
.Func(_SC("NameEquals"), &Player_EachWhereNameEquals) .Func(_SC("NameEquals"), &Player_EachWhereNameEquals)
.Func(_SC("NameBegins"), &Player_EachWhereNameBegins) .Func(_SC("NameBegins"), &Player_EachWhereNameBegins)
.Func(_SC("NameEnds"), &Player_EachWhereNameEnds) .Func(_SC("NameEnds"), &Player_EachWhereNameEnds)
.Func(_SC("NameContains"), &Player_EachWhereNameContains) .Func(_SC("NameContains"), &Player_EachWhereNameContains)
.Func(_SC("NameMatches"), &Player_EachWhereNameMatches)
); );
each_ns.Bind(_SC("Vehicle"), Table(vm) each_ns.Bind(_SC("Vehicle"), Table(vm)
@ -590,6 +679,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CVehicle >::EachWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CVehicle >::EachWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CVehicle >::EachWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CVehicle >::EachWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CVehicle >::EachWhereTagContains) .Func(_SC("TagContains"), &Entity< CVehicle >::EachWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CVehicle >::EachWhereTagMatches)
); );
RootTable(vm).Bind(_SC("SqForeach"), each_ns); RootTable(vm).Bind(_SC("SqForeach"), each_ns);
@ -602,6 +692,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CBlip >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CBlip >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CBlip >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CBlip >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CBlip >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CBlip >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CBlip >::CountWhereTagMatches)
); );
count_ns.Bind(_SC("Checkpoint"), Table(vm) count_ns.Bind(_SC("Checkpoint"), Table(vm)
@ -610,6 +701,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CCheckpoint >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CCheckpoint >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CCheckpoint >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CCheckpoint >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CCheckpoint >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CCheckpoint >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CCheckpoint >::CountWhereTagMatches)
); );
count_ns.Bind(_SC("Keybind"), Table(vm) count_ns.Bind(_SC("Keybind"), Table(vm)
@ -618,6 +710,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CKeybind >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CKeybind >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CKeybind >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CKeybind >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CKeybind >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CKeybind >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CKeybind >::CountWhereTagMatches)
); );
count_ns.Bind(_SC("Object"), Table(vm) count_ns.Bind(_SC("Object"), Table(vm)
@ -626,6 +719,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CObject >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CObject >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CObject >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CObject >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CObject >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CObject >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CObject >::CountWhereTagMatches)
); );
count_ns.Bind(_SC("Pickup"), Table(vm) count_ns.Bind(_SC("Pickup"), Table(vm)
@ -634,6 +728,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPickup >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPickup >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPickup >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPickup >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPickup >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CPickup >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPickup >::CountWhereTagMatches)
); );
count_ns.Bind(_SC("Player"), Table(vm) count_ns.Bind(_SC("Player"), Table(vm)
@ -642,10 +737,12 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CPlayer >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CPlayer >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CPlayer >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CPlayer >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CPlayer >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CPlayer >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CPlayer >::CountWhereTagMatches)
.Func(_SC("NameEquals"), &Player_CountWhereNameEquals) .Func(_SC("NameEquals"), &Player_CountWhereNameEquals)
.Func(_SC("NameBegins"), &Player_CountWhereNameBegins) .Func(_SC("NameBegins"), &Player_CountWhereNameBegins)
.Func(_SC("NameEnds"), &Player_CountWhereNameEnds) .Func(_SC("NameEnds"), &Player_CountWhereNameEnds)
.Func(_SC("NameContains"), &Player_CountWhereNameContains) .Func(_SC("NameContains"), &Player_CountWhereNameContains)
.Func(_SC("NameMatches"), &Player_CountWhereNameMatches)
); );
count_ns.Bind(_SC("Vehicle"), Table(vm) count_ns.Bind(_SC("Vehicle"), Table(vm)
@ -654,6 +751,7 @@ void Register(HSQUIRRELVM vm)
.Func(_SC("TagBegins"), &Entity< CVehicle >::CountWhereTagBegins) .Func(_SC("TagBegins"), &Entity< CVehicle >::CountWhereTagBegins)
.Func(_SC("TagEnds"), &Entity< CVehicle >::CountWhereTagEnds) .Func(_SC("TagEnds"), &Entity< CVehicle >::CountWhereTagEnds)
.Func(_SC("TagContains"), &Entity< CVehicle >::CountWhereTagContains) .Func(_SC("TagContains"), &Entity< CVehicle >::CountWhereTagContains)
.Func(_SC("TagMatches"), &Entity< CVehicle >::CountWhereTagMatches)
); );
RootTable(vm).Bind(_SC("SqCount"), count_ns); RootTable(vm).Bind(_SC("SqCount"), count_ns);

View File

@ -153,6 +153,14 @@ inline Int32 CompareStr(CSStr lhs, CSStr rhs, Uint32 pos, Uint32 len, bool cs)
return cs ? strncmp(lhs, rhs, len) : sqmod_strnicmp(lhs, rhs, len); return cs ? strncmp(lhs, rhs, len) : sqmod_strnicmp(lhs, rhs, len);
} }
/* ------------------------------------------------------------------------------------------------
* Compare the specified strings.
*/
inline bool ApplyStrFilter(CSStr name, CSStr filter, bool cs)
{
return cs ? NameFilterCheck(filter, name) : NameFilterCheckInsensitive(filter, name);
}
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* Collect all elements within the specified range that the inspector deems worthy. * Collect all elements within the specified range that the inspector deems worthy.
*/ */
@ -267,6 +275,24 @@ void EachContains(Iterator first, Iterator last,
} }
} }
/* ------------------------------------------------------------------------------------------------
* Collect all elements within the specified range where the string matches or not the specified
* filter.
*/
template < typename Iterator, typename Inspector, typename Retriever, typename Collector >
void EachMatches(Iterator first, Iterator last,
Inspector inspect, Retriever retrieve, Collector collect,
CSStr str, bool neg, bool cs)
{
for (; first != last; ++first)
{
if (inspect(*first) && ApplyStrFilter(retrieve(*first).c_str(), str, cs) == neg)
{
collect(*first);
}
}
}
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* Find the first element within the specified range where the string matches or not the specified one. * Find the first element within the specified range where the string matches or not the specified one.
*/ */
@ -372,6 +398,25 @@ void FirstContains(Iterator first, Iterator last,
} }
} }
/* ------------------------------------------------------------------------------------------------
* Find the first element within the specified range where the string matches or not the specified
* filter.
*/
template < typename Iterator, typename Inspector, typename Retriever, typename Receiver >
void FirstMatches(Iterator first, Iterator last,
Inspector inspect, Retriever retrieve, Receiver receive,
CSStr str, bool neg, bool cs)
{
for (; first != last; ++first)
{
if (inspect(*first) && ApplyStrFilter(retrieve(*first).c_str(), str, cs) == neg)
{
receive(*first);
break;
}
}
}
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* Used to work with entity instances in a template fashion. * Used to work with entity instances in a template fashion.
*/ */
@ -975,6 +1020,22 @@ public:
return Var< Array >(DefaultVM::Get(), -1).value; return Var< Array >(DefaultVM::Get(), -1).value;
} }
/* --------------------------------------------------------------------------------------------
* Collect all entities of this type where the tag matches or not the specified filter.
*/
static inline Array AllWhereTagMatches(bool neg, bool cs, CSStr tag)
{
SQMOD_VALID_TAG_STR(tag)
// Remember the current stack size
const StackGuard sg;
// Allocate an empty array on the stack
sq_newarray(DefaultVM::Get(), 0);
// Process each entity in the pool
EachMatches(Inst::CBegin(), Inst::CEnd(), ValidInst(), InstTag(), AppendElem(), tag, !neg, cs);
// Return the array at the top of the stack
return Var< Array >(DefaultVM::Get(), -1).value;
}
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Retrieve the first entity of this type where the tag matches or not the specified one. * Retrieve the first entity of this type where the tag matches or not the specified one.
*/ */
@ -1035,6 +1096,21 @@ public:
return recv.mObj; return recv.mObj;
} }
/* --------------------------------------------------------------------------------------------
* Retrieve the first entity of this type where the tag matches or not the specified filter.
*/
static inline Object FirstWhereTagMatches(bool neg, bool cs, CSStr tag)
{
SQMOD_VALID_TAG_STR(tag)
// Create a new element receiver
RecvElem recv;
// Process each entity in the pool
FirstMatches(Inst::CBegin(), Inst::CEnd(), ValidInst(), InstTag(),
std::reference_wrapper< RecvElem >(recv), tag, !neg, cs);
// Return the received element, if any
return recv.mObj;
}
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Process all active entities of this type. * Process all active entities of this type.
*/ */
@ -1109,6 +1185,21 @@ public:
return fwd.mCount; return fwd.mCount;
} }
/* --------------------------------------------------------------------------------------------
* Process all entities of this type where the tag match the specified filter.
*/
static inline Uint32 EachWhereTagMatches(bool neg, bool cs, CSStr tag, Object & env, Function & func)
{
SQMOD_VALID_TAG_STR(tag)
// Create a new element forwarder
ForwardElem fwd(env, func);
// Process each entity in the pool
EachMatches(Inst::CBegin(), Inst::CEnd(), ValidInst(), InstTag(),
std::reference_wrapper< ForwardElem >(fwd), tag, !neg, cs);
// Return the forward count
return fwd.mCount;
}
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Count all active entities of this type. * Count all active entities of this type.
*/ */
@ -1182,6 +1273,21 @@ public:
// Return the count // Return the count
return cnt; return cnt;
} }
/* --------------------------------------------------------------------------------------------
* Count all entities of this type where the tag matches the specified filter.
*/
static inline Uint32 CountWhereTagMatches(bool neg, bool cs, CSStr tag)
{
SQMOD_VALID_TAG_STR(tag)
// Create a new element counter
CountElem cnt;
// Process each entity in the pool
EachMatches(Inst::CBegin(), Inst::CEnd(), ValidInst(), InstTag(),
std::reference_wrapper< CountElem >(cnt), tag, !neg, cs);
// Return the count
return cnt;
}
}; };
} // Namespace:: Algo } // Namespace:: Algo