• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

CExpIter.h

Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00034 //*****************************************************************************
00035 
00036 // include basic definitions
00037 #include "pbori_defs.h"
00038 
00039 // get stuff for term iteration
00040 #include "CTermStack.h"
00041 #include "CTermIter.h"
00042 
00043 #ifndef CExpIter_h_
00044 #define CExpIter_h_
00045 
00046 BEGIN_NAMESPACE_PBORI
00047 
00048 
00049 template <class ExpType>
00050 class CExpGenerator {
00051 
00052 public:
00053   typedef ExpType value_type;
00054   typedef const value_type& result_type;
00055   typedef typename value_type::size_type size_type;
00056 
00058   CExpGenerator(): m_result() {}
00059 
00061   template <class SequenceType>
00062   result_type operator()(const SequenceType&) const{
00063     return m_result;
00064   }
00065 
00067   void resize(size_type nlen) { m_result.resize(nlen); }
00068 
00070   void reserve(size_type nlen) { m_result.reserve(nlen); }
00071 
00073   size_type size() const { return m_result.size(); }
00074 
00076   template <class Iterator>
00077   void append(Iterator start, Iterator finish) { 
00078     while (start != finish){
00079       m_result.push_back(*start);
00080       ++start;
00081     }
00082   }
00083 
00084 private:
00085   value_type m_result;
00086 };
00087 
00088 
00089 template <class NaviType, class ExpType>
00090 struct pbori_base<CExpIter<NaviType, ExpType> > {
00091 
00092   typedef CTermStack<NaviType, std::forward_iterator_tag> stack_type;
00093   typedef CTermIter<stack_type, CExpGenerator<ExpType> > type;
00094 };
00095 
00096 template <class NaviType, class ExpType>
00097 class CExpIter : 
00098   public pbori_base<CExpIter<NaviType, ExpType> >::type {
00099 
00100 public:
00102   typedef CExpIter<NaviType, ExpType> self;
00103 
00105   typedef typename pbori_base<self>::type base;
00106 
00108   CExpIter(NaviType navi): base(navi, typename base::term_generator() ) {
00109     base::m_getTerm.reserve(base::m_stack.size());
00110     base::m_getTerm.append(base::begin(), base::end()); 
00111   }
00112   
00114   CExpIter(): base() {}
00115 
00117   void increment() { 
00118     assert(!base::m_stack.empty());
00119     if (base::m_stack.markedOne()) {
00120       base::m_stack.clearOne();
00121     }
00122     else {
00123       base::m_stack.next();
00124       base::m_getTerm.resize( base::m_stack.size() == 0 ?
00125                               0: 
00126                               base::m_stack.size() - 1);
00127 
00128       if (!base::m_stack.empty()) {
00129         base::m_stack.followThen();
00130         base::m_stack.terminate();
00131      }
00132     }
00133     base::m_getTerm.reserve(base::m_stack.size());
00134     base::m_getTerm.append(base::begin() + base::m_getTerm.size(), base::end());
00135   }
00136 
00138   self& operator++() {
00139     increment();
00140     return *this;
00141   }
00143   self operator++(int) {
00144     self copy(*this);
00145     increment();
00146     return copy;
00147   }
00148 };
00149 
00150 END_NAMESPACE_PBORI
00151 
00152 #endif

Generated on Thu Oct 21 2010 06:56:30 for PolyBoRi by  doxygen 1.7.1