77 #ifndef CTermGenerator_h_
78 #define CTermGenerator_h_
83 template <
class TermType,
class BehaviourTag = type_tag<TermType> >
84 class CTermGeneratorBase;
87 template <
class TermType>
88 class CTermGeneratorBase<TermType, type_tag<BooleMonomial> >{
91 typedef TermType value_type;
92 typedef value_type result_type;
94 template <
class SequenceType>
95 result_type operator()(
const SequenceType& seq)
const{
97 value_type result(!seq.isZero());
99 typename SequenceType::stack_reverse_iterator
100 start(seq.stackRBegin()), finish(seq.stackREnd());
102 #ifndef PBORI_NO_TERMS_BY_TAIL
103 typename BooleSet::navigator navi(result.diagram().navigation());
105 assert((start == finish) || !start->isConstant());
106 while((start != finish) &&
107 (start->elseBranch().isEmpty()) && (start->thenBranch() == navi) ) {
112 result = value_type(BooleSet(navi));
115 while (start != finish){
116 result.changeAssign(**start);
126 template <
class TermType>
133 template <
class SequenceType>
137 result.reserve(seq.deg());
138 typename SequenceType::const_iterator
139 start(seq.begin()), finish(seq.end());
141 while (start != finish){
142 result.push_back(*start);
149 template <
class TermType>
155 template <
class SequenceType>
163 template <
class TermType>
165 public CTermGeneratorBase<TermType> {
167 typedef CTermGeneratorBase<TermType>
base;
182 template <
class TermType,
class BehaviourTag = type_tag<TermType> >
183 class MyCTermGeneratorBase;
185 template <
class TermType>
205 template <
class SequenceType>
210 assert(!seq.isZero());
213 typedef typename value_type::ring_type ring_type;
214 typedef typename ring_type::manager_type manager_type;
215 value_type result((ring_type)manager_type(m_data));
217 typename SequenceType::stack_reverse_iterator
218 start(seq.stackRBegin()), finish(seq.stackREnd());
220 #ifndef PBORI_NO_TERMS_BY_TAIL
223 assert((start == finish) || !start->isConstant());
224 while((start != finish) &&
225 (start->elseBranch().isEmpty()) && (start->thenBranch() == navi) ) {
233 while (start != finish){
234 result.changeAssign(**start);
245 public CTermGeneratorBase<BooleMonomial> {
248 typedef CTermGeneratorBase<term_type>
base;