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

生物技术

开发平台:

C/C++

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