Advertisement
Guest User

PersistentMap

a guest
May 4th, 2016
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. template <class Key, class FileType, class Compare = std::less<Key>>
  2. class PersistentMap;
  3.  
  4. //Proxy trida pro umozneni pouzivat something[index]= value; konstrukce, kde je somethind=konteiner, index=key,value= mapped_type;
  5. template<class Key, class Mapped_Type, class Compare = std::less<Key>>
  6. struct PersistentMapProxy
  7. {
  8.     PersistentMap<Key, Mapped_Type, Compare> & parent;
  9.     Key key;
  10.     Mapped_Type *value;
  11.     //konstruktor
  12.     PersistentMapProxy(PersistentMap<Key, Mapped_Type, Compare> & parent, Key key)
  13.         : parent(parent), key(key),value(new Mapped_Type((*parent.find(key)).second))
  14.     {
  15.         /* kdy bych potreboval aby behem myMap[10]; vytvoril novy uzel dreva a file tak bych tady pridal kode, ale ne ma to smysl protoze kdy bych uzivatel napsal  myMap[10]; a potom mapped_type a=myMap[10];
  16.         tak do a dosli bych ne konsinstentny data;
  17.         */
  18.     }
  19.  
  20.  
  21.     //pridava nebo updejtuje strom ktery je v parent
  22.     const Mapped_Type& operator = (const Mapped_Type& value_)   const
  23.     {
  24.         *value = value_;
  25.         parent.insert(std::make_pair(key, value_));
  26.         return *value;
  27.     }
  28.  
  29.     //vrati hodnotu
  30.     operator Mapped_Type&() const
  31.     {
  32.         //PersistentMap<Key, Mapped_Type, Compare>::iterator it = parent.find(key);
  33.         return *value;
  34.     }
  35.  
  36.     ~PersistentMapProxy()
  37.     {
  38.         parent.insert(std::make_pair(key, *value));
  39.         delete value;
  40.     }
  41. };
  42.  
  43. template <typename Key, typename FileType, class Compare = std::less<Key>>
  44. class PersistentMap {
  45. public:
  46.     typedef int size_type;
  47.     typedef std::pair<Key, FileType> value_type;
  48.     typedef FileType mapped_type;
  49.     typedef AVL_Tree<Key, FileType> tree;
  50.     typedef PersistentMapProxy<Key, mapped_type, Compare> Proxy;
  51.  
  52. private:
  53.     std::string dirName;
  54.     tree *strom;
  55.     Compare comp;
  56. public:
  57.  
  58.     typedef typename tree::iterator iterator;
  59.     typedef typename tree::const_iterator const_iterator;
  60.  
  61.     //iteratory
  62.     iterator begin()
  63.     {
  64.         //iterator::a = t;     
  65.         return strom->begin();
  66.     }
  67.  
  68.     iterator end()
  69.     {
  70.         return strom->end();
  71.     }
  72.  
  73.     const_iterator cbegin()
  74.     {
  75.         return strom->cbegin();
  76.     }
  77.  
  78.     const_iterator cend()
  79.     {
  80.         return strom->cend();
  81.     }
  82.  
  83.     //constructory & destruktory
  84.     PersistentMap(std::string ag) :dirName(ag)
  85.     {
  86.         path p(ag);
  87.         if (!fs::exists(p))
  88.             fs::create_directory(ag);
  89.         strom = new tree(dirName);
  90.     };
  91.  
  92.     ~PersistentMap()
  93.     {
  94.         delete strom;
  95.     }
  96.  
  97.     //operatory
  98.     const Proxy operator[] (Key key)
  99.     {
  100.         return Proxy(*this, key);
  101.     }
  102.  
  103.  
  104.     //methody
  105.     //vrati pair iteratoru na `a` & bool ktery rika, byl ly vytvoren uzel, nebo jenom updejtovan
  106.     std::pair<iterator, bool> insert(const value_type& a)
  107.     {
  108.         int count = strom->getCount();
  109.         iterator it = iterator(strom->insert(a));
  110.         if (count< strom->getCount())
  111.             return std::make_pair(it, true);
  112.         else
  113.             return std::make_pair(it, false);
  114.     }
  115.  
  116.     //vrati iterator na a
  117.     iterator find(const Key& a)
  118.     {
  119.         return iterator(*strom->findKey(a));
  120.     }
  121.  
  122.     //vrati const_iterator na a
  123.     const_iterator find(const Key& a) const
  124.     {
  125.         return const_iterator(*strom->findKey(a));
  126.     }
  127.  
  128.     //vrati iterator na a++
  129.     iterator erase(const_iterator a)
  130.     {
  131.         iterator prev = a++;
  132.         erase((*prev).first);
  133.         return a;
  134.     }
  135.  
  136.     //maze z kontejneru element s klicem "a"
  137.     void erase(iterator first, iterator last)
  138.     {
  139.         iterator it;
  140.         iterator prev = first++;
  141.         for (it = first; it != last; prev = it++)
  142.         {
  143.             strom->erase((*prev).first);
  144.         }
  145.         strom->erase((*prev).first);
  146.     }
  147.  
  148.     //maze uzel s key a file key, a vrati pocet uzlu v stromu
  149.     size_type erase(const Key& k)
  150.     {
  151.         strom->erase(k);
  152.         return strom->getCount();
  153.     }
  154. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement