PolyBoRi
CTermIter.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
105 //*****************************************************************************
106 
107 // include basic definitions
108 #include "pbori_defs.h"
109 
110 // include polybori functionals
111 #include "pbori_func.h"
112 
113 // include polybori properties
114 #include "pbori_traits.h"
115 
116 
117 // include boost's interator facade
118 #include <boost/iterator/iterator_facade.hpp>
119 
120 #include "BooleEnv.h"
121 #ifndef CTermIter_h_
122 #define CTermIter_h_
123 
125 
126 
133 template <class StackType, class TermGeneratorType>
134 class CTermIter:
135  public boost::iterator_facade<
136  CTermIter<StackType, TermGeneratorType>,
137  typename TermGeneratorType::value_type,
138  typename StackType::iterator_category,
139  typename TermGeneratorType::result_type
140  > {
141 
142 public:
143 
145  typedef StackType stack_type;
146 
148  typedef typename stack_type::navigator navigator;
149 
151  typedef typename navigator::idx_type idx_type;
152 
154  typedef typename navigator::bool_type bool_type;
155 
157  typedef typename navigator::size_type size_type;
158 
160  typedef TermGeneratorType term_generator;
161 
163 
164  typedef typename stack_type::const_iterator const_iterator;
165  typedef typename stack_type::const_reverse_iterator
168 
170  CTermIter(const CTermIter& rhs):
171  m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) {
172  }
173 
175  template <class MgrType>
176  CTermIter(navigator navi, const MgrType& mgr):
177  m_getTerm(mgr), m_stack(navi, mgr) {
178  m_stack.init();
179  }
180 
182  CTermIter(): m_getTerm(), m_stack() {}
183 
186 
188  void increment() {
189  m_stack.increment();
190  }
191 
193  bool_type equal (const CTermIter& rhs) const {
194  return m_stack.equal(rhs.m_stack);
195  }
196 
198  typename term_generator::result_type dereference() const {
199  return m_getTerm(m_stack);
200  }
201 
203 
204  const_iterator begin() const { return m_stack.begin(); }
205  const_iterator end() const { return m_stack.end(); }
206  const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
207  const_reverse_iterator rend() const { return m_stack.rend(); }
209 
211  bool_type isOne() const { return m_stack.isOne(); }
212 
214  bool_type isZero() const { return m_stack.isZero(); }
215 
217  bool_type isEnd() const { return isZero(); }
218 
220  size_type deg() const { return m_stack.deg(); }
221 
223  idx_type firstIndex() const {
224  assert(!m_stack.empty());
225  return *begin();
226  }
227 
230  return m_stack.navigation();
231  }
232 
233 protected:
236 
239 };
240 
241 
243 
244 #endif
245