1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-01-19 03:57:14 +01:00

Use Poco SharedPtr to maintain compatibility with it.

This commit is contained in:
Sandu Liviu Catalin 2021-01-31 17:32:16 +02:00
parent 12ac87d8fd
commit f53b5b348d

View File

@ -3,6 +3,9 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
#include "Core/Utility.hpp" #include "Core/Utility.hpp"
// ------------------------------------------------------------------------------------------------
#include "Poco/SharedPtr.h"
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
#include <vector> #include <vector>
#include <random> #include <random>
@ -92,7 +95,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Reference to the container. * Reference to the container.
*/ */
using Reference = std::shared_ptr< Container >; using Reference = Poco::SharedPtr< Container >;
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Type given used to interact with specialized value cases. * Type given used to interact with specialized value cases.
@ -123,7 +126,7 @@ template < class T > struct SqVector
* Default constructor. * Default constructor.
*/ */
SqVector() SqVector()
: mC(std::make_shared< Container >()) : mC(Poco::makeShared< Container >())
{ {
} }
@ -195,12 +198,39 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and return it. * Make sure a container instance is referenced and return it.
*/ */
Container & Valid() const { Validate(); return *mC; } Container & Valid() { Validate(); return *mC; }
/* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and return it.
*/
const Container & Valid() const { Validate(); return *mC; }
/* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and return its reference.
*/
Reference & ValidRef() { Validate(); return mC; }
/* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and return its reference.
*/
const Reference & ValidRef() const { Validate(); return mC; }
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Make sure an index is within rance and return the container it. Container must exist. * Make sure an index is within rance and return the container it. Container must exist.
*/ */
Container & ValidIdx(SQInteger i) const Container & ValidIdx(SQInteger i)
{
if (static_cast< size_t >(i) >= mC->size())
{
STHROWF("Invalid vector container index(" PRINT_INT_FMT ")", i);
}
return *mC;
}
/* --------------------------------------------------------------------------------------------
* Make sure an index is within rance and return the container it. Container must exist.
*/
const Container & ValidIdx(SQInteger i) const
{ {
if (static_cast< size_t >(i) >= mC->size()) if (static_cast< size_t >(i) >= mC->size())
{ {
@ -212,7 +242,20 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and is populated, then return it. * Make sure a container instance is referenced and is populated, then return it.
*/ */
Container & ValidPop() const Container & ValidPop()
{
Validate();
if (mC->empty())
{
STHROWF("Vector container is empty");
}
return *mC;
}
/* --------------------------------------------------------------------------------------------
* Make sure a container instance is referenced and is populated, then return it.
*/
const Container & ValidPop() const
{ {
Validate(); Validate();
if (mC->empty()) if (mC->empty())
@ -233,7 +276,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Retrieve a value from the container. * Retrieve a value from the container.
*/ */
SQMOD_NODISCARD typename std::add_const< ReturnType >::type Get(SQInteger i) const SQMOD_NODISCARD typename std::add_const< ReturnType >::type Get(SQInteger i)
{ {
return ValidIdx(i).at(ClampL< SQInteger, size_t >(i)); return ValidIdx(i).at(ClampL< SQInteger, size_t >(i));
} }
@ -249,7 +292,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Retrieve the first element in the container. * Retrieve the first element in the container.
*/ */
SQMOD_NODISCARD typename std::add_const< ReturnType >::type Front() const SQMOD_NODISCARD typename std::add_const< ReturnType >::type Front()
{ {
return ValidPop().front(); return ValidPop().front();
} }
@ -257,7 +300,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Retrieve the last element in the container. * Retrieve the last element in the container.
*/ */
SQMOD_NODISCARD typename std::add_const< ReturnType >::type Back() const SQMOD_NODISCARD typename std::add_const< ReturnType >::type Back()
{ {
return ValidPop().back(); return ValidPop().back();
} }
@ -403,7 +446,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Locate the position of a value. * Locate the position of a value.
*/ */
SQMOD_NODISCARD SQInteger Locate(OptimalArg v) const SQMOD_NODISCARD SQInteger Locate(OptimalArg v)
{ {
auto itr = std::find(Valid().begin(), Valid().end(), Opt::Get(v)); auto itr = std::find(Valid().begin(), Valid().end(), Opt::Get(v));
return itr == mC->end() ? -1 : static_cast< SQInteger >(std::distance(mC->begin(), itr)); return itr == mC->end() ? -1 : static_cast< SQInteger >(std::distance(mC->begin(), itr));
@ -412,7 +455,7 @@ template < class T > struct SqVector
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Locate the position of a value starting from an offset. * Locate the position of a value starting from an offset.
*/ */
SQMOD_NODISCARD SQInteger LocateFrom(SQInteger p, OptimalArg v) const SQMOD_NODISCARD SQInteger LocateFrom(SQInteger p, OptimalArg v)
{ {
Validate(); Validate();
auto itr = std::find(ValidIdx(p).begin() + static_cast< size_t >(p), auto itr = std::find(ValidIdx(p).begin() + static_cast< size_t >(p),
@ -438,7 +481,7 @@ template < class T > struct SqVector
*/ */
SqVector Slice(SQInteger p, SQInteger n) const SqVector Slice(SQInteger p, SQInteger n) const
{ {
return SqVector(std::make_shared< Container >(ValidIdx(p).begin() + static_cast< size_t >(p), return SqVector(Poco::makeShared< Container >(ValidIdx(p).begin() + static_cast< size_t >(p),
ValidIdx(p + n).begin() + static_cast< size_t >(p + n))); ValidIdx(p + n).begin() + static_cast< size_t >(p + n)));
} }