SafeVector.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:4k
源码类别:

网格计算

开发平台:

Visual C++

  1. // SafeVector.cpp: implementation of the CSafeVector class.
  2. //
  3. // Written by Marat Bedretdinov (maratb@hotmail.com)
  4. // Copyright (c) 2000.
  5. //
  6. // This code may be used in compiled form in any way you desire. This
  7. // file may be redistributed unmodified by any means PROVIDING it is 
  8. // not sold for profit without the authors written consent, and 
  9. // providing that this notice and the authors name is included. 
  10. //
  11. // If the source code in  this file is used in any commercial application 
  12. // then acknowledgement must be made to the author of this file 
  13. // and permissions to use this file are requested from the author
  14. //
  15. // (in whatever form you wish).// This file is provided "as is" with no expressed or implied warranty.
  16. // The author accepts no liability if it causes any damage whatsoever.
  17. // It's free - so you get what you pay for.//
  18. //////////////////////////////////////////////////////////////////////
  19. // Construction/Destruction
  20. //////////////////////////////////////////////////////////////////////
  21. template <class T> void safe_vector<T>::push_back(const T& x)
  22. {
  23.   m_mutex.Lock();
  24.   m_vecItems.push_back(x);
  25.   m_mutex.Unlock();
  26. }
  27. template <class T> void safe_vector<T>::pop_back()
  28. {
  29. // don't event attempt to pop it if it's empty
  30.   if (!size()) return;
  31.   m_mutex.Lock();
  32.   m_vecItems.pop_back();
  33.   m_mutex.Unlock();
  34. }
  35. template <class T> int safe_vector<T>::find(const T& proto)
  36. {
  37.   m_mutex.Lock();
  38.   for (int i=0; i<m_vecItems.size(); i++)
  39.     if (m_vecItems.at(i) == proto) {
  40.   m_mutex.Unlock();
  41.   return i;
  42. }
  43.   m_mutex.Unlock();
  44.   return -1;
  45. }
  46. template <class T> T safe_vector<T>::operator[](unsigned int i)
  47. {
  48.   T item;
  49.   try {
  50.     m_mutex.Lock();
  51.     item = m_vecItems.at(i);
  52.     m_mutex.Unlock();
  53.   } catch (out_of_range x) {
  54. m_mutex.Unlock();
  55.   throw x;
  56.   }
  57.   return item;
  58. }
  59. template <class T> unsigned int safe_vector<T>::size()
  60. {
  61.   m_mutex.Lock();
  62.   unsigned int sz = m_vecItems.size();
  63.   m_mutex.Unlock();
  64.   return sz;
  65. }
  66. template <class T> void safe_vector<T>::pop_at(unsigned int i)
  67. {
  68.   if (i < 0 || i > size())
  69. return;
  70.   m_mutex.Lock();
  71.   vector<T> temp; 
  72.   vector<T>::iterator it = m_vecItems.begin();
  73.   for (; it != m_vecItems.end(); it++) {
  74. if (*it != m_vecItems.at(i))
  75.       temp.push_back(*it);
  76.   }
  77.   m_vecItems.clear();
  78.   m_vecItems.insert(m_vecItems.end(), temp.begin(), temp.end());
  79.   m_mutex.Unlock();
  80. }
  81. /////////////////////////////////////////////////////////////////
  82. template <class T> list<T>::reference safe_list<T>::back()
  83. {
  84.   m_mutex.Lock();
  85.   list<T>::reference r = m_vecItems.back();
  86.   m_mutex.Unlock();
  87.   return r;
  88. }
  89. template <class T> void safe_list<T>::push_back(const T& x)
  90. {
  91.   m_mutex.Lock();
  92.   m_vecItems.push_back(x);
  93.   m_mutex.Unlock();
  94. }
  95. template <class T> void safe_list<T>::pop_back()
  96. {
  97. // don't even attempt to pop it if it's empty
  98.   if (!size()) return;
  99.   m_mutex.Lock();
  100.   m_vecItems.pop_back();
  101.   m_mutex.Unlock();
  102. }
  103. template <class T> list<T>::reference safe_list<T>::front()
  104. {
  105.   m_mutex.Lock();
  106.   list<T>::reference r = m_vecItems.front();
  107.   m_mutex.Unlock();
  108.   return r;
  109. }
  110. template <class T> void safe_list<T>::push_front(const T& x)
  111. {
  112.   m_mutex.Lock();
  113.   m_vecItems.push_front(x);
  114.   m_mutex.Unlock();
  115. }
  116. template <class T> void safe_list<T>::pop_front()
  117. {
  118. // don't even attempt to pop it if it's empty
  119.   if (!size()) return;
  120.   m_mutex.Lock();
  121.   m_vecItems.pop_front();
  122.   m_mutex.Unlock();
  123. }
  124. template <class T> T safe_list<T>::retrieve_front()
  125. {
  126. if (!size()) return NULL;
  127. m_mutex.Lock();  
  128. T item = m_vecItems.front();
  129. m_vecItems.pop_front();
  130. m_mutex.Unlock();
  131. return item;
  132. }
  133. template <class T> void safe_list<T>::wipe()
  134. {
  135.   m_mutex.Lock();
  136.   while (m_vecItems.size() > 0) {
  137. T item = m_vecItems.front();
  138. delete item;
  139. m_vecItems.pop_front();
  140.   }
  141.   m_mutex.Unlock();
  142. }
  143. template <class T> unsigned int safe_list<T>::size()
  144. {
  145.   m_mutex.Lock();
  146.   unsigned int sz = m_vecItems.size();
  147.   m_mutex.Unlock();
  148.   return sz;
  149. }