Adding several const, assert, and small optimizations
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@785 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
59bc51b565
commit
7dc499a4e1
1 changed files with 19 additions and 24 deletions
|
@ -332,8 +332,9 @@ namespace Loki
|
||||||
// This function sorts the map according to the score
|
// This function sorts the map according to the score
|
||||||
// and returns the lower bound of the sorted container
|
// and returns the lower bound of the sorted container
|
||||||
DT& getLowerBound(){
|
DT& getLowerBound(){
|
||||||
|
assert(!m_mHitCount.empty());
|
||||||
SwappedHitMap copyMap;
|
SwappedHitMap copyMap;
|
||||||
for(HitMapItr itr = m_mHitCount.begin(); itr != m_mHitCount.end(); itr++)
|
for(HitMapItr itr = m_mHitCount.begin(); itr != m_mHitCount.end(); ++itr)
|
||||||
copyMap.insert(SwappedPair(itr->second, itr->first));
|
copyMap.insert(SwappedPair(itr->second, itr->first));
|
||||||
if(copyMap.rbegin()->first == 0) // the higher score is 0 ...
|
if(copyMap.rbegin()->first == 0) // the higher score is 0 ...
|
||||||
throw EvictionException(); // there is no key evict
|
throw EvictionException(); // there is no key evict
|
||||||
|
@ -395,8 +396,7 @@ namespace Loki
|
||||||
// LRU Eviction policy
|
// LRU Eviction policy
|
||||||
void evict()
|
void evict()
|
||||||
{
|
{
|
||||||
DT& evictKey = EH::getLowerBound();
|
remove(EH::getLowerBound());
|
||||||
remove(evictKey);
|
|
||||||
}
|
}
|
||||||
const char* name(){return "LRU";}
|
const char* name(){return "LRU";}
|
||||||
};
|
};
|
||||||
|
@ -440,10 +440,10 @@ namespace Loki
|
||||||
// If the key is the key of the fetched object :
|
// If the key is the key of the fetched object :
|
||||||
// the counter is shifted to the right and it's MSB is set to 1
|
// the counter is shifted to the right and it's MSB is set to 1
|
||||||
// else
|
// else
|
||||||
// the counter is shifted to the right
|
// the counter is shifted to the left
|
||||||
void onRelease(const DT& key)
|
void onRelease(const DT& key)
|
||||||
{
|
{
|
||||||
for( HitMapItr itr = EH::m_mHitCount.begin(); itr != EH::m_mHitCount.end(); itr++){
|
for( HitMapItr itr = EH::m_mHitCount.begin(); itr != EH::m_mHitCount.end(); ++itr){
|
||||||
itr->second = (itr->first == key ? (itr->second >> 1) | ( 1 << ((sizeof(ST)-1)*8) ) : itr->second >> 1);
|
itr->second = (itr->first == key ? (itr->second >> 1) | ( 1 << ((sizeof(ST)-1)*8) ) : itr->second >> 1);
|
||||||
D( cout << itr->second << endl; )
|
D( cout << itr->second << endl; )
|
||||||
}
|
}
|
||||||
|
@ -461,8 +461,7 @@ namespace Loki
|
||||||
// LRU with Aging Eviction policy
|
// LRU with Aging Eviction policy
|
||||||
void evict()
|
void evict()
|
||||||
{
|
{
|
||||||
DT& evictKey = EH::getLowerBound();
|
remove(EH::getLowerBound());
|
||||||
remove(evictKey);
|
|
||||||
}
|
}
|
||||||
const char* name(){return "LRU with aging";}
|
const char* name(){return "LRU with aging";}
|
||||||
};
|
};
|
||||||
|
@ -511,12 +510,10 @@ namespace Loki
|
||||||
// Random Eviction policy
|
// Random Eviction policy
|
||||||
void evict()
|
void evict()
|
||||||
{
|
{
|
||||||
if(m_vKeys.size()==0)
|
if(m_vKeys.empty())
|
||||||
throw EvictionException();
|
throw EvictionException();
|
||||||
size_type random = static_cast<size_type>((m_vKeys.size()*rand())/int(RAND_MAX + 1));
|
size_type random = static_cast<size_type>((m_vKeys.size()*rand())/int(RAND_MAX + 1));
|
||||||
iterator pos = m_vKeys.begin()+random;
|
remove(*(m_vKeys.begin()+random));
|
||||||
DT& evictKey = *pos;
|
|
||||||
remove(evictKey);
|
|
||||||
}
|
}
|
||||||
const char* name(){return "random";}
|
const char* name(){return "random";}
|
||||||
};
|
};
|
||||||
|
@ -702,8 +699,6 @@ namespace Loki
|
||||||
|
|
||||||
AbstractProduct* const getPointerToObjectInContainer(ObjVector &entry)
|
AbstractProduct* const getPointerToObjectInContainer(ObjVector &entry)
|
||||||
{
|
{
|
||||||
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
|
||||||
|
@ -719,7 +714,7 @@ namespace Loki
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldCreateObject(AbstractProduct* pProduct){
|
bool shouldCreateObject(AbstractProduct * const pProduct){
|
||||||
if(pProduct!=NULL) // object already exists
|
if(pProduct!=NULL) // object already exists
|
||||||
return false;
|
return false;
|
||||||
if(CP::canCreate()==false) // Are we allowed to Create ?
|
if(CP::canCreate()==false) // Are we allowed to Create ?
|
||||||
|
@ -727,33 +722,33 @@ namespace Loki
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReleaseObjectFromContainer(ObjVector &entry, AbstractProduct* const object)
|
void ReleaseObjectFromContainer(ObjVector &entry, AbstractProduct * const object)
|
||||||
{
|
{
|
||||||
entry.push_back(object);
|
entry.push_back(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFetch(AbstractProduct* pProduct)
|
void onFetch(AbstractProduct * const pProduct)
|
||||||
{
|
{
|
||||||
SP::onFetch();
|
SP::onFetch();
|
||||||
EP::onFetch(pProduct);
|
EP::onFetch(pProduct);
|
||||||
++outObjects;
|
++outObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRelease(AbstractProduct* pProduct)
|
void onRelease(AbstractProduct * const pProduct)
|
||||||
{
|
{
|
||||||
SP::onRelease();
|
SP::onRelease();
|
||||||
EP::onRelease(pProduct);
|
EP::onRelease(pProduct);
|
||||||
--outObjects;
|
--outObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onCreate(AbstractProduct* pProduct)
|
void onCreate(AbstractProduct * const pProduct)
|
||||||
{
|
{
|
||||||
CP::onCreate();
|
CP::onCreate();
|
||||||
SP::onCreate();
|
SP::onCreate();
|
||||||
EP::onCreate(pProduct);
|
EP::onCreate(pProduct);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onDestroy(AbstractProduct* pProduct)
|
void onDestroy(AbstractProduct * const pProduct)
|
||||||
{
|
{
|
||||||
CP::onDestroy();
|
CP::onDestroy();
|
||||||
SP::onDestroy();
|
SP::onDestroy();
|
||||||
|
@ -761,7 +756,7 @@ namespace Loki
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void remove(AbstractProduct* pProduct)
|
virtual void remove(AbstractProduct * const pProduct)
|
||||||
{
|
{
|
||||||
typename FetchedObjToKeyMap::iterator fetchedItr = providedObjects.find(pProduct);
|
typename FetchedObjToKeyMap::iterator fetchedItr = providedObjects.find(pProduct);
|
||||||
if(fetchedItr!=providedObjects.end()) // object is unreleased.
|
if(fetchedItr!=providedObjects.end()) // object is unreleased.
|
||||||
|
@ -769,7 +764,7 @@ namespace Loki
|
||||||
bool productRemoved = false;
|
bool productRemoved = false;
|
||||||
typename KeyToObjVectorMap::iterator objVectorItr;
|
typename KeyToObjVectorMap::iterator objVectorItr;
|
||||||
typename ObjVector::iterator objItr;
|
typename ObjVector::iterator objItr;
|
||||||
for(objVectorItr=fromKeyToObjVector.begin();objVectorItr!=fromKeyToObjVector.end();objVectorItr++)
|
for(objVectorItr=fromKeyToObjVector.begin();objVectorItr!=fromKeyToObjVector.end();++objVectorItr)
|
||||||
{
|
{
|
||||||
ObjVector &v(objVectorItr->second);
|
ObjVector &v(objVectorItr->second);
|
||||||
objItr = remove_if(v.begin(), v.end(), bind2nd(equal_to<AbstractProduct*>(), pProduct));
|
objItr = remove_if(v.begin(), v.end(), bind2nd(equal_to<AbstractProduct*>(), pProduct));
|
||||||
|
@ -803,8 +798,9 @@ namespace Loki
|
||||||
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)
|
||||||
delete itr->first;
|
delete itr->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -829,9 +825,8 @@ namespace Loki
|
||||||
return factory.Unregister(id);
|
return factory.Unregister(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO : prevent the Vector to be returned by copy.
|
|
||||||
/// Return the registered ID in this Factory
|
/// Return the registered ID in this Factory
|
||||||
std::vector<IdentifierType> RegisteredIds()
|
std::vector<IdentifierType>& RegisteredIds()
|
||||||
{
|
{
|
||||||
return factory.RegisteredIds();
|
return factory.RegisteredIds();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue