add CachedFactory, patches for: msvc, build system
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@720 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
cf3ca512e6
commit
78febe17ec
8 changed files with 522 additions and 452 deletions
|
@ -34,6 +34,15 @@
|
||||||
#define D( x ) ;
|
#define D( x ) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <time.h>
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
typedef ::clock_t clock_t;
|
||||||
|
int clock(){ return ::clock();}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
using std::clock_t;
|
using std::clock_t;
|
||||||
using std::clock;
|
using std::clock;
|
||||||
using std::bind2nd;
|
using std::bind2nd;
|
||||||
|
@ -142,7 +151,7 @@ namespace Loki
|
||||||
|
|
||||||
void cleanVector()
|
void cleanVector()
|
||||||
{
|
{
|
||||||
clock_t currentTime = clock();
|
clock_t currentTime = std::clock();
|
||||||
D( cout << "currentTime = " << currentTime<< endl; )
|
D( cout << "currentTime = " << currentTime<< endl; )
|
||||||
D( cout << "currentTime - lastUpdate = " << currentTime - lastUpdate<< endl; )
|
D( cout << "currentTime - lastUpdate = " << currentTime - lastUpdate<< endl; )
|
||||||
if(currentTime - lastUpdate > timeValidity)
|
if(currentTime - lastUpdate > timeValidity)
|
||||||
|
@ -191,7 +200,7 @@ namespace Loki
|
||||||
|
|
||||||
void onCreate()
|
void onCreate()
|
||||||
{
|
{
|
||||||
m_vTimes.push_back(clock());
|
m_vTimes.push_back(std::clock());
|
||||||
}
|
}
|
||||||
|
|
||||||
void onDestroy()
|
void onDestroy()
|
||||||
|
@ -324,7 +333,7 @@ namespace Loki
|
||||||
EH::m_mHitCount[key] = 0;
|
EH::m_mHitCount[key] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFetch(const DT& key)
|
void onFetch(const DT&)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +385,7 @@ namespace Loki
|
||||||
EH::m_mHitCount[key] = 0;
|
EH::m_mHitCount[key] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFetch(const DT& key){}
|
void onFetch(const DT&){}
|
||||||
|
|
||||||
// onRelease increments the hit counter associated with the object
|
// onRelease increments the hit counter associated with the object
|
||||||
// Updating every counters by iterating over the map
|
// Updating every counters by iterating over the map
|
||||||
|
@ -428,10 +437,10 @@ namespace Loki
|
||||||
typedef typename std::vector< DT >::iterator iterator;
|
typedef typename std::vector< DT >::iterator iterator;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onCreate(const DT& key){
|
void onCreate(const DT&){
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFetch(const DT& key){
|
void onFetch(const DT& ){
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRelease(const DT& key){
|
void onRelease(const DT& key){
|
||||||
|
@ -561,7 +570,7 @@ namespace Loki
|
||||||
template <typename , typename> class EvictionPolicy = EvictRandom,
|
template <typename , typename> class EvictionPolicy = EvictRandom,
|
||||||
class StatisticPolicy = NoStatisticPolicy,
|
class StatisticPolicy = NoStatisticPolicy,
|
||||||
template<typename, class> class FactoryErrorPolicy = DefaultFactoryError,
|
template<typename, class> class FactoryErrorPolicy = DefaultFactoryError,
|
||||||
template<typename _T, class = std::allocator<_T> > class Vector = std::vector
|
class ObjVector = std::vector<AbstractProduct*>
|
||||||
>
|
>
|
||||||
class CachedFactory :
|
class CachedFactory :
|
||||||
protected EncapsulationPolicy<AbstractProduct>,
|
protected EncapsulationPolicy<AbstractProduct>,
|
||||||
|
@ -595,7 +604,7 @@ namespace Loki
|
||||||
typedef typename NP::ProductReturn ProductReturn;
|
typedef typename NP::ProductReturn ProductReturn;
|
||||||
|
|
||||||
typedef Key< Impl, IdentifierType > Key;
|
typedef Key< Impl, IdentifierType > Key;
|
||||||
typedef Vector< AbstractProduct* > ObjVector;
|
//typedef typename Vector ObjVector;
|
||||||
typedef std::map< Key, ObjVector > KeyToObjVectorMap;
|
typedef std::map< Key, ObjVector > KeyToObjVectorMap;
|
||||||
typedef std::map< AbstractProduct*, Key > FetchedObjToKeyMap;
|
typedef std::map< AbstractProduct*, Key > FetchedObjToKeyMap;
|
||||||
|
|
||||||
|
@ -612,6 +621,7 @@ namespace Loki
|
||||||
AbstractProduct* const getPointerToObjectInContainer(ObjVector &entry)
|
AbstractProduct* const getPointerToObjectInContainer(ObjVector &entry)
|
||||||
{
|
{
|
||||||
AbstractProduct* pObject = NULL;
|
AbstractProduct* pObject = NULL;
|
||||||
|
(void) pObject;
|
||||||
if(entry.empty()) // No object available
|
if(entry.empty()) // No object available
|
||||||
{ // the object will be created in the calling function.
|
{ // the object will be created in the calling function.
|
||||||
// It has to be created in the calling function because of
|
// It has to be created in the calling function because of
|
||||||
|
@ -707,7 +717,9 @@ namespace Loki
|
||||||
//assert(outObjects==0);
|
//assert(outObjects==0);
|
||||||
// debug information
|
// debug information
|
||||||
if(!providedObjects.empty())
|
if(!providedObjects.empty())
|
||||||
|
{
|
||||||
D( cout << "====>> Cache destructor : deleting "<< providedObjects.size()<<" objects <<====" << endl << endl; )
|
D( cout << "====>> Cache destructor : deleting "<< providedObjects.size()<<" objects <<====" << endl << endl; )
|
||||||
|
}
|
||||||
// cleaning the Cache
|
// cleaning the Cache
|
||||||
typename FetchedObjToKeyMap::iterator itr;
|
typename FetchedObjToKeyMap::iterator itr;
|
||||||
for(itr=providedObjects.begin(); itr!=providedObjects.end();itr++)
|
for(itr=providedObjects.begin(); itr!=providedObjects.end();itr++)
|
||||||
|
|
|
@ -25,6 +25,20 @@
|
||||||
|
|
||||||
namespace Loki
|
namespace Loki
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template<
|
||||||
|
class Factory,
|
||||||
|
typename IdentifierType
|
||||||
|
>
|
||||||
|
class Key;
|
||||||
|
|
||||||
|
template<class F, typename I>
|
||||||
|
bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
|
||||||
|
|
||||||
|
template<class F, typename I>
|
||||||
|
bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A Key class
|
* A Key class
|
||||||
*/
|
*/
|
||||||
|
@ -303,441 +317,454 @@ namespace Loki
|
||||||
this->p14 = p14;
|
this->p14 = p14;
|
||||||
this->p15 = p15;
|
this->p15 = p15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class F, typename I>
|
||||||
|
friend bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
|
||||||
|
|
||||||
friend bool operator==(const EmptyType &k1, const EmptyType &k2)
|
template<class F, typename I>
|
||||||
{
|
friend bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
|
||||||
return true;
|
};
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator==(const Key &k1, const Key &k2)
|
|
||||||
{
|
|
||||||
if( k1.count != k2.count )
|
|
||||||
return false;
|
|
||||||
switch(k1.count){
|
|
||||||
case -1:
|
|
||||||
return true;
|
|
||||||
case 0:
|
|
||||||
if( k1.id == k2.id )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 1:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 2:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 3:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 4:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 5:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 6:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 7:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 8:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 9:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 10:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 11:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) &&
|
|
||||||
(k1.p11 == k2.p11) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 12:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) &&
|
|
||||||
(k1.p11 == k2.p11) &&
|
|
||||||
(k1.p12 == k2.p12) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 13:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) &&
|
|
||||||
(k1.p11 == k2.p11) &&
|
|
||||||
(k1.p12 == k2.p12) &&
|
|
||||||
(k1.p13 == k2.p13) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 14:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) &&
|
|
||||||
(k1.p11 == k2.p11) &&
|
|
||||||
(k1.p12 == k2.p12) &&
|
|
||||||
(k1.p13 == k2.p13) &&
|
|
||||||
(k1.p14 == k2.p14) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 15:
|
|
||||||
if( (k1.id == k2.id) &&
|
|
||||||
(k1.p1 == k2.p1) &&
|
|
||||||
(k1.p2 == k2.p2) &&
|
|
||||||
(k1.p3 == k2.p3) &&
|
|
||||||
(k1.p4 == k2.p4) &&
|
|
||||||
(k1.p5 == k2.p5) &&
|
|
||||||
(k1.p6 == k2.p6) &&
|
|
||||||
(k1.p7 == k2.p7) &&
|
|
||||||
(k1.p8 == k2.p8) &&
|
|
||||||
(k1.p9 == k2.p9) &&
|
|
||||||
(k1.p10 == k2.p10) &&
|
|
||||||
(k1.p11 == k2.p11) &&
|
|
||||||
(k1.p12 == k2.p12) &&
|
|
||||||
(k1.p13 == k2.p13) &&
|
|
||||||
(k1.p14 == k2.p14) &&
|
|
||||||
(k1.p15 == k2.p15) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator<(const EmptyType &k1, const EmptyType &k2)
|
template<class F, typename I>
|
||||||
{
|
bool operator==(const Key<F, I> &k1, const Key<F, I> &k2)
|
||||||
|
{
|
||||||
|
if( k1.count != k2.count )
|
||||||
return false;
|
return false;
|
||||||
}
|
switch(k1.count){
|
||||||
|
case -1:
|
||||||
friend bool operator<(const Key &k1, const Key &k2)
|
|
||||||
{
|
|
||||||
if( k1.count < k2.count )
|
|
||||||
return true;
|
return true;
|
||||||
switch(k1.count){
|
case 0:
|
||||||
case -1:
|
if( k1.id == k2.id )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
return false;
|
return false;
|
||||||
case 0:
|
case 1:
|
||||||
if( k1.id < k2.id )
|
if( (k1.id == k2.id) &&
|
||||||
return true;
|
(k1.p1 == k2.p1) )
|
||||||
else
|
return true;
|
||||||
return false;
|
else
|
||||||
case 1:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 2:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 3:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 4:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 5:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 6:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 7:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 8:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 9:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 10:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 11:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) ||
|
|
||||||
(k1.p11 < k2.p11) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 12:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) ||
|
|
||||||
(k1.p11 < k2.p11) ||
|
|
||||||
(k1.p12 < k2.p12) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 13:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) ||
|
|
||||||
(k1.p11 < k2.p11) ||
|
|
||||||
(k1.p12 < k2.p12) ||
|
|
||||||
(k1.p13 < k2.p13) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 14:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) ||
|
|
||||||
(k1.p11 < k2.p11) ||
|
|
||||||
(k1.p12 < k2.p12) ||
|
|
||||||
(k1.p13 < k2.p13) ||
|
|
||||||
(k1.p14 < k2.p14) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
case 15:
|
|
||||||
if( (k1.id < k2.id) ||
|
|
||||||
(k1.p1 < k2.p1) ||
|
|
||||||
(k1.p2 < k2.p2) ||
|
|
||||||
(k1.p3 < k2.p3) ||
|
|
||||||
(k1.p4 < k2.p4) ||
|
|
||||||
(k1.p5 < k2.p5) ||
|
|
||||||
(k1.p6 < k2.p6) ||
|
|
||||||
(k1.p7 < k2.p7) ||
|
|
||||||
(k1.p8 < k2.p8) ||
|
|
||||||
(k1.p9 < k2.p9) ||
|
|
||||||
(k1.p10 < k2.p10) ||
|
|
||||||
(k1.p11 < k2.p11) ||
|
|
||||||
(k1.p12 < k2.p12) ||
|
|
||||||
(k1.p13 < k2.p13) ||
|
|
||||||
(k1.p14 < k2.p14) ||
|
|
||||||
(k1.p15 < k2.p15) )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return false;
|
return false;
|
||||||
}
|
case 2:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 3:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 4:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 5:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 6:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 7:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 8:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 9:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 10:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 11:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) &&
|
||||||
|
(k1.p11 == k2.p11) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 12:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) &&
|
||||||
|
(k1.p11 == k2.p11) &&
|
||||||
|
(k1.p12 == k2.p12) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 13:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) &&
|
||||||
|
(k1.p11 == k2.p11) &&
|
||||||
|
(k1.p12 == k2.p12) &&
|
||||||
|
(k1.p13 == k2.p13) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 14:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) &&
|
||||||
|
(k1.p11 == k2.p11) &&
|
||||||
|
(k1.p12 == k2.p12) &&
|
||||||
|
(k1.p13 == k2.p13) &&
|
||||||
|
(k1.p14 == k2.p14) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 15:
|
||||||
|
if( (k1.id == k2.id) &&
|
||||||
|
(k1.p1 == k2.p1) &&
|
||||||
|
(k1.p2 == k2.p2) &&
|
||||||
|
(k1.p3 == k2.p3) &&
|
||||||
|
(k1.p4 == k2.p4) &&
|
||||||
|
(k1.p5 == k2.p5) &&
|
||||||
|
(k1.p6 == k2.p6) &&
|
||||||
|
(k1.p7 == k2.p7) &&
|
||||||
|
(k1.p8 == k2.p8) &&
|
||||||
|
(k1.p9 == k2.p9) &&
|
||||||
|
(k1.p10 == k2.p10) &&
|
||||||
|
(k1.p11 == k2.p11) &&
|
||||||
|
(k1.p12 == k2.p12) &&
|
||||||
|
(k1.p13 == k2.p13) &&
|
||||||
|
(k1.p14 == k2.p14) &&
|
||||||
|
(k1.p15 == k2.p15) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class F, typename I>
|
||||||
|
bool operator<(const Key<F, I> &k1, const Key<F, I> &k2)
|
||||||
|
{
|
||||||
|
if( k1.count < k2.count )
|
||||||
|
return true;
|
||||||
|
switch(k1.count){
|
||||||
|
case -1:
|
||||||
|
return false;
|
||||||
|
case 0:
|
||||||
|
if( k1.id < k2.id )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 1:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 2:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 3:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 4:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 5:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 6:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 7:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 8:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 9:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 10:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 11:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) ||
|
||||||
|
(k1.p11 < k2.p11) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 12:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) ||
|
||||||
|
(k1.p11 < k2.p11) ||
|
||||||
|
(k1.p12 < k2.p12) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 13:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) ||
|
||||||
|
(k1.p11 < k2.p11) ||
|
||||||
|
(k1.p12 < k2.p12) ||
|
||||||
|
(k1.p13 < k2.p13) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 14:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) ||
|
||||||
|
(k1.p11 < k2.p11) ||
|
||||||
|
(k1.p12 < k2.p12) ||
|
||||||
|
(k1.p13 < k2.p13) ||
|
||||||
|
(k1.p14 < k2.p14) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
case 15:
|
||||||
|
if( (k1.id < k2.id) ||
|
||||||
|
(k1.p1 < k2.p1) ||
|
||||||
|
(k1.p2 < k2.p2) ||
|
||||||
|
(k1.p3 < k2.p3) ||
|
||||||
|
(k1.p4 < k2.p4) ||
|
||||||
|
(k1.p5 < k2.p5) ||
|
||||||
|
(k1.p6 < k2.p6) ||
|
||||||
|
(k1.p7 < k2.p7) ||
|
||||||
|
(k1.p8 < k2.p8) ||
|
||||||
|
(k1.p9 < k2.p9) ||
|
||||||
|
(k1.p10 < k2.p10) ||
|
||||||
|
(k1.p11 < k2.p11) ||
|
||||||
|
(k1.p12 < k2.p12) ||
|
||||||
|
(k1.p13 < k2.p13) ||
|
||||||
|
(k1.p14 < k2.p14) ||
|
||||||
|
(k1.p15 < k2.p15) )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const EmptyType&, const EmptyType&)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const EmptyType&, const EmptyType&)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace Loki
|
} // namespace Loki
|
||||||
|
|
||||||
#endif /*_KEY_H_*/
|
#endif /*_KEY_H_*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[Project]
|
[Project]
|
||||||
FileName=CachedFactory.dev
|
FileName=CachedFactory.dev
|
||||||
Name=Factory
|
Name=Factory
|
||||||
UnitCount=2
|
UnitCount=3
|
||||||
Type=1
|
Type=1
|
||||||
Ver=1
|
Ver=1
|
||||||
ObjFiles=
|
ObjFiles=
|
||||||
|
@ -47,9 +47,6 @@ ProductName=
|
||||||
ProductVersion=
|
ProductVersion=
|
||||||
AutoIncBuildNr=0
|
AutoIncBuildNr=0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Unit1]
|
[Unit1]
|
||||||
FileName=CachedFactoryTest.cpp
|
FileName=CachedFactoryTest.cpp
|
||||||
CompileCpp=1
|
CompileCpp=1
|
||||||
|
@ -59,3 +56,24 @@ Link=1
|
||||||
Priority=1000
|
Priority=1000
|
||||||
OverrideBuildCmd=0
|
OverrideBuildCmd=0
|
||||||
BuildCmd=
|
BuildCmd=
|
||||||
|
|
||||||
|
[Unit2]
|
||||||
|
FileName=..\..\src\SmallObj.cpp
|
||||||
|
CompileCpp=1
|
||||||
|
Folder=Factory
|
||||||
|
Compile=1
|
||||||
|
Link=1
|
||||||
|
Priority=1000
|
||||||
|
OverrideBuildCmd=0
|
||||||
|
BuildCmd=
|
||||||
|
|
||||||
|
[Unit3]
|
||||||
|
FileName=..\..\src\Singleton.cpp
|
||||||
|
CompileCpp=1
|
||||||
|
Folder=Factory
|
||||||
|
Compile=1
|
||||||
|
Link=1
|
||||||
|
Priority=1000
|
||||||
|
OverrideBuildCmd=0
|
||||||
|
BuildCmd=
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8,00"
|
Version="8,00"
|
||||||
Name="Factory"
|
Name="CachedFactory"
|
||||||
ProjectGUID="{925D5863-2F77-41B7-96F1-CC814762C40F}"
|
ProjectGUID="{925D5863-2F77-41B7-96F1-CC814762C40F}"
|
||||||
RootNamespace="CachedFactory"
|
RootNamespace="CachedFactory"
|
||||||
Keyword="Win32Proj"
|
Keyword="Win32Proj"
|
||||||
|
@ -169,17 +169,25 @@
|
||||||
</References>
|
</References>
|
||||||
<Files>
|
<Files>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\CachedFactoryTest.cpp"
|
RelativePath="..\..\include\loki\CachedFactory.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\loki\CachedFactory.h"
|
RelativePath=".\CachedFactoryTest.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\loki\Key.h"
|
RelativePath="..\..\include\loki\Key.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\Singleton.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\SmallObj.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
</Globals>
|
</Globals>
|
||||||
|
|
|
@ -106,9 +106,9 @@ void testCacheOverhead(){
|
||||||
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictRandom > CRandomEvict;
|
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictRandom > CRandomEvict;
|
||||||
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictLRU > CLRUEvict;
|
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictLRU > CLRUEvict;
|
||||||
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictAging > CAgingEvict;
|
typedef CachedFactory< AbstractProduct, int, NullType, SimplePointer, AmountLimitedCreation, EvictAging > CAgingEvict;
|
||||||
bool test1 = dispResult("Random policy", unitTestCacheOverhead< CRandomEvict >(loop));
|
bool test1 = dispResult("Random policy", unitTestCacheOverhead< CRandomEvict >(loop));(void)test1;
|
||||||
bool test2 = dispResult("LRU policy", unitTestCacheOverhead< CLRUEvict >(loop));
|
bool test2 = dispResult("LRU policy", unitTestCacheOverhead< CLRUEvict >(loop));(void)test2;
|
||||||
bool test3 = dispResult("Aging policy", unitTestCacheOverhead< CAgingEvict >(loop));
|
bool test3 = dispResult("Aging policy", unitTestCacheOverhead< CAgingEvict >(loop));(void)test3;
|
||||||
}
|
}
|
||||||
void unitTestCachePerformance(int loop){
|
void unitTestCachePerformance(int loop){
|
||||||
typedef CachedFactory< AbstractProduct, int > CCache;
|
typedef CachedFactory< AbstractProduct, int > CCache;
|
||||||
|
@ -148,7 +148,7 @@ std::clock_t typicalUse( Cache &CC, unsigned objectKind, unsigned maxObjectCount
|
||||||
std::clock_t start, end;
|
std::clock_t start, end;
|
||||||
try{
|
try{
|
||||||
// Registering objects
|
// Registering objects
|
||||||
for(int i=0;i<objectKind;i++)
|
for(size_t i=0;i<objectKind;i++)
|
||||||
CC.Register(i, createProductNull);
|
CC.Register(i, createProductNull);
|
||||||
// Simulating real use
|
// Simulating real use
|
||||||
start = std::clock();
|
start = std::clock();
|
||||||
|
@ -312,6 +312,7 @@ bool testRelease(){
|
||||||
AbstractProduct *pProduct = NULL;
|
AbstractProduct *pProduct = NULL;
|
||||||
CC.ReleaseObject(pProduct);
|
CC.ReleaseObject(pProduct);
|
||||||
cout << "Caching failed" << endl;
|
cout << "Caching failed" << endl;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -397,7 +398,7 @@ void reliabilityTests()
|
||||||
dispText("One or more test have failed");
|
dispText("One or more test have failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int , char **)
|
||||||
{
|
{
|
||||||
try{
|
try{
|
||||||
performanceTests();
|
performanceTests();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
include ../Makefile.common
|
include ../Makefile.common
|
||||||
|
|
||||||
BIN := Factory$(BIN_SUFFIX)
|
BIN := CachedFactoryTest$(BIN_SUFFIX)
|
||||||
SRC := Factory.cpp
|
SRC := CachedFactoryTest.cpp
|
||||||
OBJ := $(SRC:.cpp=.o)
|
OBJ := $(SRC:.cpp=.o)
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
cl -c -Zm200 -O2 -DNDEBUG -MT -EHsc -GR -W4 -wd4710 -I"." -I"..\..\include" CachedFactoryTest.cpp.cpp
|
cl -c -Zm200 -O2 -DNDEBUG -MT -EHsc -GR -W4 -wd4710 -I"." -I"..\..\include" CachedFactoryTest.cpp
|
||||||
|
|
||||||
link /NOLOGO /SUBSYSTEM:CONSOLE /incremental:no /OUT:"main-msvc.exe" ..\..\lib\loki.lib CachedFactoryTest.cpp.obj
|
link /NOLOGO /SUBSYSTEM:CONSOLE /incremental:no /OUT:"main-msvc.exe" ..\..\lib\loki.lib CachedFactoryTest.obj
|
||||||
|
|
||||||
del *.obj
|
del *.obj
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
|
||||||
|
cd CachedFactory
|
||||||
|
call make.msvc.bat
|
||||||
|
cd ..
|
||||||
|
|
||||||
cd DeletableSingleton
|
cd DeletableSingleton
|
||||||
call make.msvc.bat
|
call make.msvc.bat
|
||||||
cd ..
|
cd ..
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue