00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #ifndef STXXL_CONTAINERS_BTREE__BTREE_PAGER_H
00014 #define STXXL_CONTAINERS_BTREE__BTREE_PAGER_H
00015 
00016 #include <memory>
00017 #include <list>
00018 
00019 #include <stxxl/bits/noncopyable.h>
00020 #include <stxxl/bits/common/utils.h>
00021 #include <stxxl/bits/compat_auto_ptr.h>
00022 
00023 
00024 __STXXL_BEGIN_NAMESPACE
00025 
00026 namespace btree
00027 {
00028     class lru_pager : private noncopyable
00029     {
00030         unsigned_type npages_;
00031         typedef std::list<int_type> list_type;
00032 
00033         compat_auto_ptr<list_type>::result history;
00034         std::vector<list_type::iterator> history_entry;
00035 
00036     public:
00037         lru_pager() : npages_(0)
00038         { }
00039 
00040         lru_pager(unsigned_type npages) :
00041             npages_(npages),
00042             history(new list_type),
00043             history_entry(npages_)
00044         {
00045             for (unsigned_type i = 0; i < npages_; i++)
00046             {
00047                 history_entry[i] = history->insert(history->end(), static_cast<int_type>(i));
00048             }
00049         }
00050         ~lru_pager() { }
00051         int_type kick()
00052         {
00053             return history->back();
00054         }
00055         void hit(int_type ipage)
00056         {
00057             assert(ipage < int_type(npages_));
00058             assert(ipage >= 0);
00059             history->splice(history->begin(), *history, history_entry[ipage]);
00060         }
00061         void swap(lru_pager & obj)
00062         {
00063             std::swap(npages_, obj.npages_);
00064             
00065             
00066             compat_auto_ptr<list_type>::result tmp = obj.history;
00067             obj.history = history;
00068             history = tmp;
00069             std::swap(history_entry, obj.history_entry);
00070         }
00071     };
00072 }
00073 
00074 __STXXL_END_NAMESPACE
00075 
00076 
00077 namespace std
00078 {
00079     inline void swap(stxxl::btree::lru_pager & a,
00080                      stxxl::btree::lru_pager & b)
00081     {
00082         a.swap(b);
00083     }
00084 }
00085 
00086 #endif