mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-01-31 09:57:14 +01:00
Fixed a bug in routines that prevented more than one routine to exist in a bucket.
Also added several helper functions to query information about routines.
This commit is contained in:
parent
839c3c3434
commit
bbb4c12f9c
@ -28,7 +28,7 @@ SQInteger Routine::Typename(HSQUIRRELVM vm)
|
|||||||
void Routine::Attach(Routine * routine, Interval interval)
|
void Routine::Attach(Routine * routine, Interval interval)
|
||||||
{
|
{
|
||||||
// Do we have a valid routine and interval bucket to attach?
|
// Do we have a valid routine and interval bucket to attach?
|
||||||
if (!routine || ! interval)
|
if (!routine || !interval)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -43,7 +43,7 @@ void Routine::Attach(Routine * routine, Interval interval)
|
|||||||
s_Buckets.back().mRoutines.push_back(routine);
|
s_Buckets.back().mRoutines.push_back(routine);
|
||||||
}
|
}
|
||||||
// Is this routine already attached to this bucket?
|
// Is this routine already attached to this bucket?
|
||||||
else if (std::find(itr->mRoutines.begin(), itr->mRoutines.end(), routine) != itr->mRoutines.end())
|
else if (std::find(itr->mRoutines.begin(), itr->mRoutines.end(), routine) == itr->mRoutines.end())
|
||||||
{
|
{
|
||||||
itr->mRoutines.push_back(routine); // Then let's attach it now
|
itr->mRoutines.push_back(routine); // Then let's attach it now
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ void Routine::Attach(Routine * routine, Interval interval)
|
|||||||
void Routine::Detach(Routine * routine, Interval interval)
|
void Routine::Detach(Routine * routine, Interval interval)
|
||||||
{
|
{
|
||||||
// Do we have a valid routine and interval to detach?
|
// Do we have a valid routine and interval to detach?
|
||||||
if (!routine || ! interval)
|
if (!routine || !interval)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -849,11 +849,80 @@ Object Routine::Create(Object & env, Function & func, Interval interval, Iterate
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
Uint32 Routine::Count()
|
void Routine::Flush()
|
||||||
|
{
|
||||||
|
// Make sure the buckets are not locked
|
||||||
|
if (s_Lock)
|
||||||
|
{
|
||||||
|
SqThrowF("Buckets are under active lock");
|
||||||
|
}
|
||||||
|
// Process commands in queue
|
||||||
|
ProcQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Uint32 Routine::QueueSize()
|
||||||
|
{
|
||||||
|
return static_cast< Uint32 >(s_Queue.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Uint32 Routine::GetCount()
|
||||||
{
|
{
|
||||||
return static_cast< Uint32 >(s_Objects.size());
|
return static_cast< Uint32 >(s_Objects.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Uint32 Routine::GetBuckets()
|
||||||
|
{
|
||||||
|
return static_cast< Uint32 >(s_Buckets.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Uint32 Routine::GetInBucket(Interval interval)
|
||||||
|
{
|
||||||
|
// Attempt to locate the bucket with the specified interval
|
||||||
|
Buckets::iterator itr = std::find_if(s_Buckets.begin(), s_Buckets.end(), IntrvFunc(interval));
|
||||||
|
// Does this bucket exist?
|
||||||
|
if (itr == s_Buckets.end())
|
||||||
|
{
|
||||||
|
return 0; // This bucket doesn't exist!
|
||||||
|
}
|
||||||
|
// Return the number of elements in this bucket
|
||||||
|
return static_cast< Uint32 >(itr->mRoutines.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Array Routine::GetBucketsList()
|
||||||
|
{
|
||||||
|
// Allocate an array large enough to hold the number of active buckets
|
||||||
|
Array arr(DefaultVM::Get(), s_Buckets.size());
|
||||||
|
// The index where the bucket interval should be inserted
|
||||||
|
SQInteger idx = 0;
|
||||||
|
// Insert the interval and size of each active bucket
|
||||||
|
for (const auto & bucket : s_Buckets)
|
||||||
|
{
|
||||||
|
arr.SetValue(idx++, bucket.mInterval);
|
||||||
|
}
|
||||||
|
// Return the resulted array
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
Table Routine::GetBucketsTable()
|
||||||
|
{
|
||||||
|
// Create a table to hold the number of active buckets
|
||||||
|
Table tbl(DefaultVM::Get());
|
||||||
|
printf("Adding Bucket %d\n", 0);
|
||||||
|
// Insert the interval of each active bucket
|
||||||
|
for (const auto & bucket : s_Buckets)
|
||||||
|
{
|
||||||
|
tbl.SetValue(bucket.mInterval, bucket.mRoutines.size());
|
||||||
|
}
|
||||||
|
// Return the resulted table
|
||||||
|
return tbl;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
Object Routine::FindByTag(CSStr tag)
|
Object Routine::FindByTag(CSStr tag)
|
||||||
{
|
{
|
||||||
@ -912,7 +981,13 @@ void Register_Routine(HSQUIRRELVM vm)
|
|||||||
.Func(_SC("GetArg"), &Routine::GetArg)
|
.Func(_SC("GetArg"), &Routine::GetArg)
|
||||||
.Func(_SC("SetArg"), &Routine::SetArg)
|
.Func(_SC("SetArg"), &Routine::SetArg)
|
||||||
// Static Functions
|
// Static Functions
|
||||||
.StaticFunc(_SC("Count"), &Routine::Count)
|
.StaticFunc(_SC("Flush"), &Routine::Flush)
|
||||||
|
.StaticFunc(_SC("QueueSize"), &Routine::QueueSize)
|
||||||
|
.StaticFunc(_SC("Count"), &Routine::GetCount)
|
||||||
|
.StaticFunc(_SC("Buckets"), &Routine::GetBuckets)
|
||||||
|
.StaticFunc(_SC("InBucket"), &Routine::GetInBucket)
|
||||||
|
.StaticFunc(_SC("BucketsList"), &Routine::GetBucketsList)
|
||||||
|
.StaticFunc(_SC("BucketsTable"), &Routine::GetBucketsTable)
|
||||||
.StaticFunc(_SC("FindByTag"), &Routine::FindByTag)
|
.StaticFunc(_SC("FindByTag"), &Routine::FindByTag)
|
||||||
// Static Overloads
|
// Static Overloads
|
||||||
.StaticOverload< Object (*)(Object &, Function &, Routine::Interval) >
|
.StaticOverload< Object (*)(Object &, Function &, Routine::Interval) >
|
||||||
|
@ -526,10 +526,40 @@ public:
|
|||||||
static Object Create(Object & env, Function & func, Interval interval, Iterate iterations
|
static Object Create(Object & env, Function & func, Interval interval, Iterate iterations
|
||||||
, Object & a1, Object & a2, Object & a3, Object & a4, Object & a5);
|
, Object & a1, Object & a2, Object & a3, Object & a4, Object & a5);
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Flush queued commands manually.
|
||||||
|
*/
|
||||||
|
static void Flush();
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Return the number of queued commands.
|
||||||
|
*/
|
||||||
|
static Uint32 QueueSize();
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------------------------
|
||||||
* Return the number of known routines.
|
* Return the number of known routines.
|
||||||
*/
|
*/
|
||||||
static Uint32 Count();
|
static Uint32 GetCount();
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Return the number of known buckets.
|
||||||
|
*/
|
||||||
|
static Uint32 GetBuckets();
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Return the number of known routines in bucket.
|
||||||
|
*/
|
||||||
|
static Uint32 GetInBucket(Interval interval);
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Return the number of known buckets.
|
||||||
|
*/
|
||||||
|
static Array GetBucketsList();
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------
|
||||||
|
* Return the number of known buckets.
|
||||||
|
*/
|
||||||
|
static Table GetBucketsTable();
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------------------------
|
||||||
* Attempt to find a certain routine by its associated tag.
|
* Attempt to find a certain routine by its associated tag.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user