PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00013 //***************************************************************************** 00014 00015 // include basic definitions 00016 #include "pbori_defs.h" 00017 00018 // include polybori functionals 00019 #include "pbori_func.h" 00020 00021 // include polybori properties 00022 #include "pbori_traits.h" 00023 00024 00025 // include boost's interator facade 00026 #include <boost/iterator/iterator_facade.hpp> 00027 00028 #include "BooleEnv.h" 00029 #ifndef CTermIter_h_ 00030 #define CTermIter_h_ 00031 00032 BEGIN_NAMESPACE_PBORI 00033 00034 00041 template <class StackType, class TermGeneratorType> 00042 class CTermIter: 00043 public boost::iterator_facade< 00044 CTermIter<StackType, TermGeneratorType>, 00045 typename TermGeneratorType::value_type, 00046 typename StackType::iterator_category, 00047 typename TermGeneratorType::result_type 00048 > { 00049 00050 public: 00051 00053 typedef StackType stack_type; 00054 00056 typedef typename stack_type::navigator navigator; 00057 00059 typedef typename navigator::idx_type idx_type; 00060 00062 typedef typename navigator::bool_type bool_type; 00063 00065 typedef typename navigator::size_type size_type; 00066 00068 typedef typename navigator::deg_type deg_type; 00069 00071 typedef TermGeneratorType term_generator; 00072 00074 00075 typedef typename stack_type::const_iterator const_iterator; 00076 typedef typename stack_type::const_reverse_iterator 00077 const_reverse_iterator; 00079 00081 CTermIter(const CTermIter& rhs): 00082 m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) { 00083 } 00084 00086 template <class MgrType> 00087 CTermIter(navigator navi, const MgrType& mgr): 00088 m_getTerm(mgr), m_stack(navi, mgr) { 00089 m_stack.init(); 00090 } 00091 00093 CTermIter(): m_getTerm(), m_stack() {} 00094 00096 ~CTermIter() {} 00097 00099 void increment() { 00100 m_stack.increment(); 00101 } 00102 00104 void decrement() { 00105 m_stack.decrement(); 00106 } 00107 00109 bool_type equal (const CTermIter& rhs) const { 00110 return m_stack.equal(rhs.m_stack); 00111 } 00112 00114 typename term_generator::result_type dereference() const { 00115 return m_getTerm(m_stack); 00116 } 00117 00119 00120 const_iterator begin() const { return m_stack.begin(); } 00121 const_iterator end() const { return m_stack.end(); } 00122 const_reverse_iterator rbegin() const { return m_stack.rbegin(); } 00123 const_reverse_iterator rend() const { return m_stack.rend(); } 00125 00127 bool_type isOne() const { return m_stack.isOne(); } 00128 00130 bool_type isZero() const { return m_stack.isZero(); } 00131 00133 bool_type isEnd() const { return isZero(); } 00134 00136 deg_type deg() const { return m_stack.deg(); } 00137 00139 idx_type firstIndex() const { 00140 assert(!m_stack.empty()); 00141 return *begin(); 00142 } 00143 00145 navigator navigation() const { 00146 return m_stack.navigation(); 00147 } 00148 00149 protected: 00151 term_generator m_getTerm; 00152 00154 stack_type m_stack; 00155 }; 00156 00157 00158 END_NAMESPACE_PBORI 00159 00160 #endif 00161