PolyBoRi
CExpIter.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
34 //*****************************************************************************
35 
36 // include basic definitions
37 #include "pbori_defs.h"
38 
39 // get stuff for term iteration
40 #include "CTermStack.h"
41 #include "CTermIter.h"
42 
43 #ifndef CExpIter_h_
44 #define CExpIter_h_
45 
47 
48 
49 template <class ExpType>
51 
52 public:
53  typedef ExpType value_type;
54  typedef const value_type& result_type;
55  typedef typename value_type::size_type size_type;
56 
58  CExpGenerator(): m_result() {}
59 
61  template <class SequenceType>
62  result_type operator()(const SequenceType&) const{
63  return m_result;
64  }
65 
67  void resize(size_type nlen) { m_result.resize(nlen); }
68 
70  void reserve(size_type nlen) { m_result.reserve(nlen); }
71 
73  size_type size() const { return m_result.size(); }
74 
76  template <class Iterator>
77  void append(Iterator start, Iterator finish) {
78  while (start != finish){
79  m_result.push_back(*start);
80  ++start;
81  }
82  }
83 
84 private:
85  value_type m_result;
86 };
87 
88 
89 template <class NaviType, class ExpType>
90 struct pbori_base<CExpIter<NaviType, ExpType> > {
91 
92  typedef CTermStack<NaviType, std::forward_iterator_tag> stack_type;
94 };
95 
96 template <class NaviType, class ExpType>
97 class CExpIter :
98  public pbori_base<CExpIter<NaviType, ExpType> >::type {
99 
100 public:
103 
105  typedef typename pbori_base<self>::type base;
106 
108  CExpIter(NaviType navi): base(navi, typename base::term_generator() ) {
109  base::m_getTerm.reserve(base::m_stack.size());
110  base::m_getTerm.append(base::begin(), base::end());
111  }
112 
114  CExpIter(): base() {}
115 
117  void increment() {
118  assert(!base::m_stack.empty());
119  if (base::m_stack.markedOne()) {
120  base::m_stack.clearOne();
121  }
122  else {
123  base::m_stack.next();
124  base::m_getTerm.resize( base::m_stack.size() == 0 ?
125  0:
126  base::m_stack.size() - 1);
127 
128  if (!base::m_stack.empty()) {
129  base::m_stack.followThen();
130  base::m_stack.terminate();
131  }
132  }
133  base::m_getTerm.reserve(base::m_stack.size());
134  base::m_getTerm.append(base::begin() + base::m_getTerm.size(), base::end());
135  }
136 
138  self& operator++() {
139  increment();
140  return *this;
141  }
143  self operator++(int) {
144  self copy(*this);
145  increment();
146  return copy;
147  }
148 };
149 
151 
152 #endif