Go to the documentation of this file.00001
00002
00034
00035
00036
00037 #include "pbori_defs.h"
00038
00039
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