Container Enum

Vor einiger zeit wurde mir das for(it=begin();it!=end();it++) geschreibe zu nervig, deshalb hab ich mir eine Klasse dafür geschrieben.

Benutzt wird sie z.B. so:

CContainerEnum< vector<int> > enum(vec);

while(enum.next())
{
...
}

Mit nem einfachen typedef gibt es auch spezialisierte Versionen wie z.B.:

CVectorEnum< int > ( intVec);

oder

CMapEnum< int, string > (mapIntToString);

C++:
  1. template&lt;class C&gt;
  2. class CContainerEnum
  3. {
  4. public:
  5.     CContainerEnum(C* pContainer)
  6.     {
  7.         m_pContainer = pContainer;
  8.         m_it = m_pContainer-&gt;begin();
  9.         m_bFirstRun = true;
  10.     }
  11.     inline bool isLast()
  12.     {
  13.         if(m_it == m_pContainer-&gt;end())
  14.             return true;
  15.  
  16.         return m_it+1 == m_pContainer-&gt;end();
  17.     }
  18.  
  19.     inline bool hasMore()
  20.     {
  21.         return m_it != m_pContainer-&gt;end();
  22.     }
  23.     inline bool next()
  24.     {
  25.         if(!hasMore())
  26.             return false;
  27.  
  28.         if(!m_bFirstRun)
  29.             m_it++;
  30.  
  31.         m_bFirstRun = false;
  32.         return hasMore();
  33.     }
  34.     inline typename C::_Reft getCurrent()
  35.     {
  36.         assert(m_it != m_pContainer-&gt;end());
  37.  
  38.         return *m_it;
  39.     }
  40.     typename C::_Reft operator-&gt;() const
  41.     {
  42.         return *m_it;
  43.     }
  44.     operator typename C::_Reft() const
  45.     {
  46.         return *m_it;
  47.     }
  48.     inline void reset()
  49.     {
  50.         m_it = m_pContainer-&gt;begin();
  51.         m_bFirstRun = true;
  52.     }
  53.     inline size_t getCount()
  54.     {
  55.         return m_pContainer-&gt;size();
  56.     }
  57. protected:
  58.     bool    m_bFirstRun;
  59.     typename C::iterator m_it;
  60.     typename C* m_pContainer;
  61. };
  62.  
  63. template&lt;class _T&gt;
  64. class CVectorEnum : public CContainerEnum&lt;vector&lt;_T&gt;&gt;
  65. {
  66. public:
  67.     CVectorEnum(vector&lt;_t&gt;* pVector)
  68.         : CContainerEnum&lt;vector&lt;_T&gt;&gt;(pVector)
  69.     {
  70.     }
  71. };
  72.  
  73. template&lt;class _K, class _V&gt;
  74. class CMapEnum : public CContainerEnum&lt;map&lt;_K, _V&gt;&gt;
  75. {
  76. public:
  77.     CMapEnum(map&lt;_K , _V&gt;* pMap)
  78.         : CContainerEnum&lt;map&lt;_K, _V&gt;&gt;(pMap)
  79.     {
  80.     }
  81. };

Leave a Reply