PolyBoRi
|
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