map.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:10k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: map.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:43:19  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJMGR_MAP__HPP
  10. #define OBJMGR_MAP__HPP
  11. #include <corelib/ncbistd.hpp>
  12. #include <corelib/ncbicntr.hpp>
  13. #include <map>
  14. BEGIN_NCBI_SCOPE
  15. #define R_WRAP(Type, Call, Declaration) 
  16.     Type Declaration 
  17.         { 
  18.             Type ret; 
  19.             RLock(); 
  20.             ret = m_Container.Call; 
  21.             RUnlock(); 
  22.             return ret; 
  23.         }
  24. #define R_WRAP_VOID(Call, Declaration) 
  25.     void Declaration 
  26.         { 
  27.             RLock(); 
  28.             m_Container.Call; 
  29.             RUnlock(); 
  30.         }
  31. #define W_WRAP(Type, Call, Declaration) 
  32.     Type Declaration 
  33.         { 
  34.             Type ret; 
  35.             WLock(); 
  36.             ret = m_Container.Call; 
  37.             WUnlock(); 
  38.             return ret; 
  39.         }
  40. #define W_WRAP_VOID(Call, Declaration) 
  41.     void Declaration 
  42.         { 
  43.             WLock(); 
  44.             m_Container.Call; 
  45.             WUnlock(); 
  46.         }
  47. template<class Container>
  48. class map_checker
  49. {
  50.     typedef Container container_type;
  51.     typedef map_checker<Container> this_type;
  52. public:
  53.     typedef typename container_type::size_type size_type;
  54.     typedef typename container_type::key_type key_type;
  55.     typedef typename container_type::value_type value_type;
  56.     typedef typename container_type::const_iterator const_iterator;
  57.     typedef typename container_type::iterator iterator;
  58. protected:
  59.     typedef pair<const_iterator, const_iterator> const_iterator_pair;
  60.     typedef pair<iterator, iterator> iterator_pair;
  61.     typedef pair<iterator, bool> iterator_bool;
  62.     container_type m_Container;
  63.     mutable CAtomicCounter m_WCounter;
  64.     mutable CAtomicCounter m_RCounter;
  65.     void Init()
  66.         {
  67.             m_WCounter.Set(0);
  68.             m_RCounter.Set(0);
  69.         }
  70. public:
  71.     void RLock() const
  72.         {
  73.             if ( m_RCounter.Add(1) <= 0 || m_WCounter.Get() != 0 )
  74.                 abort();
  75.         }
  76.     void RUnlock() const
  77.         {
  78.             if ( m_WCounter.Get() != 0 || m_RCounter.Add(-1) < 0 )
  79.                 abort();
  80.         }
  81.     void WLock() const
  82.         {
  83.             if ( m_WCounter.Add(1) != 1 || m_RCounter.Get() != 0 )
  84.                 abort();
  85.         }
  86.     void WUnlock() const
  87.         {
  88.             if ( m_RCounter.Get() != 0 || m_WCounter.Add(-1) != 0 )
  89.                 abort();
  90.         }
  91.     iterator check(iterator pos)
  92.         {
  93.             if ( pos != m_Container.end() ) {
  94.                 iterator it = m_Container.find(pos->first);
  95.                 if ( it != pos )
  96.                     abort();
  97.             }
  98.             return pos;
  99.         }
  100.     map_checker()
  101.         {
  102.             Init();
  103.         }
  104.     ~map_checker()
  105.         {
  106.             WLock();
  107.         }
  108.     map_checker(const this_type& m)
  109.         {
  110.             Init();
  111.             *this = m;
  112.         }
  113.     this_type& operator=(const this_type& m)
  114.         {
  115.             WLock();
  116.             m.RLock();
  117.             m_Container = m.m_Container;
  118.             m.RUnlock();
  119.             WUnlock();
  120.             return *this;
  121.         }
  122.     void swap(this_type& m)
  123.         {
  124.             WLock();
  125.             m.WLock();
  126.             m_Container.swap(m);
  127.             m.WUnlock();
  128.             WUnlock();
  129.         }
  130.     bool operator==(const this_type& m) const
  131.         {
  132.             bool ret;
  133.             RLock();
  134.             m.RLock();
  135.             ret = m_Container == m.m_Container;
  136.             m.RUnlock();
  137.             RUnlock();
  138.             return ret;
  139.         }
  140.     bool operator<(const this_type& m) const
  141.         {
  142.             bool ret;
  143.             RLock();
  144.             m.RLock();
  145.             ret = m_Container < m.m_Container;
  146.             m.RUnlock();
  147.             RUnlock();
  148.             return ret;
  149.         }
  150.     R_WRAP(size_type, size(), size() const);
  151.     R_WRAP(bool, empty(), empty() const);
  152.     R_WRAP(const_iterator, begin(), begin() const);
  153.     R_WRAP(const_iterator, end(), end() const);
  154.     R_WRAP(const_iterator, find(key), find(const key_type& key) const);
  155.     R_WRAP(const_iterator, lower_bound(key), lower_bound(const key_type& key) const);
  156.     R_WRAP(const_iterator, upper_bound(key), upper_bound(const key_type& key) const);
  157.     R_WRAP(const_iterator_pair, equal_range(key), equal_range(const key_type& key) const);
  158.     R_WRAP(iterator, begin(), begin());
  159.     R_WRAP(iterator, end(), end());
  160.     R_WRAP(iterator, find(key), find(const key_type& key));
  161.     R_WRAP(iterator, lower_bound(key), lower_bound(const key_type& key));
  162.     R_WRAP(iterator, upper_bound(key), upper_bound(const key_type& key));
  163.     R_WRAP(iterator_pair, equal_range(key), equal_range(const key_type& key));
  164.     W_WRAP(iterator_bool, insert(val), insert(const value_type& val));
  165.     W_WRAP(iterator, insert(check(pos), val), insert(iterator pos, const value_type& val));
  166.     W_WRAP_VOID(erase(check(pos)), erase(iterator pos));
  167.     W_WRAP(size_type, erase(key), erase(const key_type& key));
  168.     W_WRAP_VOID(clear(), clear());
  169.     typename container_type::mapped_type& operator[](const key_type& key)
  170.         {
  171.             WLock();
  172.             typename container_type::mapped_type& ret = m_Container[key];
  173.             WUnlock();
  174.             return ret;
  175.         }
  176. };
  177. template<class Container>
  178. class multimap_checker
  179. {
  180.     typedef Container container_type;
  181.     typedef multimap_checker<Container> this_type;
  182. public:
  183.     typedef typename container_type::size_type size_type;
  184.     typedef typename container_type::key_type key_type;
  185.     typedef typename container_type::value_type value_type;
  186.     typedef typename container_type::const_iterator const_iterator;
  187.     typedef typename container_type::iterator iterator;
  188. protected:
  189.     typedef pair<const_iterator, const_iterator> const_iterator_pair;
  190.     typedef pair<iterator, iterator> iterator_pair;
  191.     typedef pair<iterator, bool> iterator_bool;
  192.     container_type m_Container;
  193.     mutable CAtomicCounter m_WCounter;
  194.     mutable CAtomicCounter m_RCounter;
  195.     void Init()
  196.         {
  197.             m_WCounter.Set(0);
  198.             m_RCounter.Set(0);
  199.         }
  200. public:
  201.     void RLock() const
  202.         {
  203.             if ( m_RCounter.Add(1) <= 0 || m_WCounter.Get() != 0 )
  204.                 abort();
  205.         }
  206.     void RUnlock() const
  207.         {
  208.             if ( m_WCounter.Get() != 0 || m_RCounter.Add(-1) < 0 )
  209.                 abort();
  210.         }
  211.     void WLock() const
  212.         {
  213.             if ( m_WCounter.Add(1) != 1 || m_RCounter.Get() != 0 )
  214.                 abort();
  215.         }
  216.     void WUnlock() const
  217.         {
  218.             if ( m_RCounter.Get() != 0 || m_WCounter.Add(-1) != 0 )
  219.                 abort();
  220.         }
  221.     iterator check(iterator pos)
  222.         {
  223.             if ( pos != m_Container.end() ) {
  224.                 iterator it = m_Container.find(pos->first);
  225.                 while ( it != m_Container.end() && it != pos && it->first == pos->first )
  226.                     ++it;
  227.                 if ( it != pos )
  228.                     abort();
  229.             }
  230.             return pos;
  231.         }
  232.     multimap_checker()
  233.         {
  234.             Init();
  235.         }
  236.     ~multimap_checker()
  237.         {
  238.             WLock();
  239.         }
  240.     multimap_checker(const this_type& m)
  241.         {
  242.             Init();
  243.             *this = m;
  244.         }
  245.     this_type& operator=(const this_type& m)
  246.         {
  247.             WLock();
  248.             m.RLock();
  249.             m_Container = m.m_Container;
  250.             m.RUnlock();
  251.             WUnlock();
  252.             return *this;
  253.         }
  254.     void swap(this_type& m)
  255.         {
  256.             WLock();
  257.             m.WLock();
  258.             m_Container.swap(m);
  259.             m.WUnlock();
  260.             WUnlock();
  261.         }
  262.     bool operator==(const this_type& m) const
  263.         {
  264.             bool ret;
  265.             RLock();
  266.             m.RLock();
  267.             ret = m_Container == m.m_Container;
  268.             m.RUnlock();
  269.             RUnlock();
  270.             return ret;
  271.         }
  272.     bool operator<(const this_type& m) const
  273.         {
  274.             bool ret;
  275.             RLock();
  276.             m.RLock();
  277.             ret = m_Container < m.m_Container;
  278.             m.RUnlock();
  279.             RUnlock();
  280.             return ret;
  281.         }
  282.     R_WRAP(size_type, size(), size() const);
  283.     R_WRAP(bool, empty(), empty() const);
  284.     R_WRAP(const_iterator, begin(), begin() const);
  285.     R_WRAP(const_iterator, end(), end() const);
  286.     R_WRAP(const_iterator, find(key), find(const key_type& key) const);
  287.     R_WRAP(const_iterator, lower_bound(key), lower_bound(const key_type& key) const);
  288.     R_WRAP(const_iterator, upper_bound(key), upper_bound(const key_type& key) const);
  289.     R_WRAP(const_iterator_pair, equal_range(key), equal_range(const key_type& key) const);
  290.     R_WRAP(iterator, begin(), begin());
  291.     R_WRAP(iterator, end(), end());
  292.     R_WRAP(iterator, find(key), find(const key_type& key));
  293.     R_WRAP(iterator, lower_bound(key), lower_bound(const key_type& key));
  294.     R_WRAP(iterator, upper_bound(key), upper_bound(const key_type& key));
  295.     R_WRAP(iterator_pair, equal_range(key), equal_range(const key_type& key));
  296.     W_WRAP(iterator, insert(val), insert(const value_type& val));
  297.     W_WRAP(iterator, insert(check(pos), val), insert(iterator pos, const value_type& val));
  298.     W_WRAP_VOID(erase(check(pos)), erase(iterator pos));
  299.     W_WRAP(size_type, erase(key), erase(const key_type& key));
  300.     W_WRAP_VOID(clear(), clear());
  301. };
  302. template<class Container>
  303. class rangemultimap_checker : public multimap_checker<Container>
  304. {
  305.     typedef Container container_type;
  306. public:
  307.     typedef typename container_type::key_type key_type;
  308.     typedef typename container_type::range_type range_type;
  309.     typedef typename container_type::iterator iterator;
  310.     typedef typename container_type::const_iterator constiterator;
  311.     R_WRAP(iterator, begin(), begin());
  312.     R_WRAP(const_iterator, begin(), begin() const);
  313.     R_WRAP(iterator, begin(range), begin(const range_type& range));
  314.     R_WRAP(const_iterator, begin(range), begin(const range_type& range) const);
  315. };
  316. #undef R_WRAP
  317. #undef R_WRAP_VOID
  318. #undef W_WRAP
  319. #undef W_WRAP_VOID
  320. template<typename Key, typename T, typename Compare = less<Key> >
  321. class map : public map_checker< std::map<Key, T, Compare> >
  322. {
  323. };
  324. template<typename Key, typename T, typename Compare = less<Key> >
  325. class multimap : public multimap_checker< std::multimap<Key, T, Compare> >
  326. {
  327. };
  328. END_NCBI_SCOPE
  329. #endif//OBJMGR_MAP__HPP