summaryrefslogtreecommitdiffstats
path: root/lib/cppparser/cachemanager.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cppparser/cachemanager.h')
-rw-r--r--lib/cppparser/cachemanager.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/cppparser/cachemanager.h b/lib/cppparser/cachemanager.h
new file mode 100644
index 00000000..3804356f
--- /dev/null
+++ b/lib/cppparser/cachemanager.h
@@ -0,0 +1,102 @@
+
+/***************************************************************************
+ copyright : (C) 2006 by David Nolden
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CACHEMANAGER_H
+#define CACHEMANAGER_H
+#include <cstdlib>
+#include <set>
+#include <limits>
+
+class CacheManager;
+
+
+class CacheNode {
+ typedef CacheManager Manager;
+ public:
+ CacheNode( Manager* manager );
+
+ virtual ~CacheNode();
+
+ void access() const;
+
+ inline uint value() const {
+ return m_value;
+ }
+
+ inline void setValue( const uint v ) const {
+ m_value = v;
+ }
+
+ inline void addValue( const uint diff ) const {
+ m_value += diff;
+ }
+
+ private:
+ Manager* m_manager;
+ mutable uint m_value; //This value stands for the priority of the node(higher is better)
+};
+
+class CacheNodeCompare {
+ public:
+ bool operator() ( const CacheNode* lhs, const CacheNode* rhs ) const {
+ if( lhs->value() != rhs->value() )
+ return lhs->value() < rhs->value();
+ else
+ return lhs < rhs; //To be able to identify nodes precisely
+ }
+};
+
+
+class CacheManager {
+ typedef std::set< const CacheNode*, CacheNodeCompare > SetType;
+ public:
+ CacheManager( int maxNodes = 1000 ) : m_currentFrame(1), m_maxNodes( maxNodes ), m_currentMax(1) {
+ };
+
+ inline int currentFrame() const {
+ return m_currentFrame;
+ }
+
+ void access( const CacheNode* node );
+
+ ///Can be used from outside to set the maximum count of nodes to keep.
+ void setMaxNodes ( int maxNodes );
+
+ void increaseFrame();
+
+ ///Can be used on a regular basis(time-triggered) to save memory: Removes half of all triggered
+ void removeLowerHalf();
+
+ virtual void saveMemory();
+
+ int currentMax() const {
+ return m_currentMax;
+ }
+
+ ///This triggered function should erase the given node.
+ virtual void erase( const CacheNode* node ) = 0;
+ private:
+ void restart( uint normalizeby );
+ friend class CacheNode;
+ void remove( const CacheNode* node );
+ void add( const CacheNode* node );
+ int m_currentFrame;
+ int m_maxNodes;
+ int m_currentMax;
+ SetType m_set;
+};
+
+
+#endif