My Project
Loading...
Searching...
No Matches
PolyEnumerator.h
Go to the documentation of this file.
1// -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2/*****************************************************************************\
3 * Computer Algebra System SINGULAR
4\*****************************************************************************/
5/** @file PolyEnumerator.h
6 *
7 * Concrete implementation of enumerators over polynomials
8 *
9 * @author Oleksandr Motsak
10 *
11 *
12 **/
13/*****************************************************************************/
14
15#ifndef POLYENUMERATOR_H
16#define POLYENUMERATOR_H
17
18// include basic definitions
19#include "coeffs/Enumerator.h"
21#include "reporter/reporter.h" // for assume etc.
22
23/** @class CBasePolyEnumerator
24 *
25 * Base polynomial enumerator for simple iteration over terms of polynomials.
26 *
27 * Note that the first element does not exist directly after Reset() call.
28 *
29 * The class doesn't inherit from IAccessor and thus doesn't override Current().
30 *
31 * @sa IBaseEnumerator, @sa CPolyCoeffsEnumerator
32 */
34{
35 template <class T>
37 private:
38 poly m_poly; ///< essentially immutable original iterable object
39
40 static const spolyrec m_prevposition_struct; ///< tag for "-1" position
41
42 protected:
43 poly m_position; ///< current position in the iterable object
44
45 public:
46 virtual bool IsValid() const
47 {
48 // not -1 or past the end position?
50 }
51
52
53 /// Reset this polynomial Enumerator with a different input polynomial
54 void Reset(poly p)
55 {
56 m_poly = p;
57 m_position = const_cast<poly>(&m_prevposition_struct);
58 assume( !IsValid() );
59 }
60
61 /// This enumerator is an empty polynomial by default
64 {
65 assume( !IsValid() );
66 }
67
68 /// Sets the position marker to the leading term.
69 virtual void Reset()
70 {
71 m_position = const_cast<poly>(&m_prevposition_struct);
72 assume( !IsValid() );
73 }
74
75
76 /// Advances the position to the next term of the polynomial.
77 /// returns true if the position marker was successfully advanced to the
78 /// next term which can be used;
79 /// false if the position marker has passed the end of the
80 /// polynomial.
81 virtual bool MoveNext()
82 {
84
85 {
86 const poly p_next = pNext(m_position);
87
88 if (p_next != NULL) // not the last term?
89 {
90 m_position = p_next;
91 assume( IsValid() );
92 return true;
93 }
94 }
95
96 if (m_position == &m_prevposition_struct) // -1 position?
97 {
98 assume( !IsValid() );
100 return (m_position != NULL);
101 }
102
103 // else: past the end (or an empty polynomial)
105 assume( !IsValid() );
106 return false;
107 }
108};
109
110
111/// This is the interface we use in coeffs.h for ClearDenominators and
112/// ClearContent.
114
115/** @class CPolyCoeffsEnumerator
116 *
117 * This is a polynomial enumerator for simple iteration over
118 * coefficients of polynomials.
119 *
120 * It is required to inherit this class from IEnumerator<number> for
121 * its use in coeffs and implement IAccessor<number> interface.
122 *
123 * Note also the virtual multiple inheritance due to the diamond
124 * problem of inheriting both CBasePolyEnumerator and IEnumerator<T>
125 * from IBaseEnumerator.
126 *
127 * @sa CBasePolyEnumerator, @sa IEnumerator
128 */
130{
131 public:
133
134 /// Gets the current element in the collection (read and write).
136 {
137 assume( IsValid() );
138 return pGetCoeff(m_position);
139 }
140
141 /// Gets the current element in the collection (read only).
143 {
144 assume( IsValid() );
145 return pGetCoeff(m_position);
146 }
147};
148
149
151{
152 static inline poly convert(const number& n)
153 {
154 // suitable for alg. ext. numbers that are just polys actually
155 return (poly)n;
156 }
157};
158
159/// go into polynomials over an alg. extension recursively
160template <class ConverterPolicy>
162{
163 private:
164 IPolyCoeffsEnumerator& m_global_enumerator; ///< iterates the input polynomial
165 CBasePolyEnumerator m_local_enumerator; ///< iterates the current coeff. of m_global_enumerator
166
167 protected:
168 virtual bool IsValid() const
169 {
170 return m_global_enumerator.IsValid() && m_local_enumerator.IsValid();
171 }
172
173 public:
174
175 /// NOTE: careful: don't destruct the input enumerator before doing it with this one...
176 /// this also changes the original IPolyCoeffsEnumerator& itr!
178
179 virtual bool MoveNext()
180 {
181 if( m_local_enumerator.MoveNext() )
182 return true;
183
184 if( !m_global_enumerator.MoveNext() ) // at the end of the main input polynomial?
185 return false;
186
187 // TODO: make the following changeable (metaprogramming: use policy?),
188 // leave the following as default option...
189 poly p = ConverterPolicy::convert(m_global_enumerator.Current()); // Assumes that these numbers are just polynomials!
190 assume( p != NULL );
191
192 // the following actually needs CPolyCoeffsEnumerator
193 m_local_enumerator.Reset( p ); // -1 position in p :: to be skipped now!
194
195 if( m_local_enumerator.MoveNext() ) // should be true
196 return true;
197
198 assume( FALSE ); return MoveNext(); // this should not happen as p should be non-zero, but just in case...
199 }
200
201 virtual void Reset()
202 {
203 m_global_enumerator.Reset();
205 }
206
207 /// Gets the current element in the collection (read and write).
209 {
210 assume( IsValid() );
211 return pGetCoeff(m_local_enumerator.m_position);
212 }
213
214 /// Gets the current element in the collection (read only).
216 {
217 assume( IsValid() );
218 return pGetCoeff(m_local_enumerator.m_position);
219 }
220};
221
222
223#endif
224/* #ifndef POLYENUMERATOR_H */
225
226// Vi-modeline: vim: filetype=c:syntax:shiftwidth=2:tabstop=8:textwidth=0:expandtab
227
Abstract API for enumerators.
IEnumerator< number > IPolyCoeffsEnumerator
This is the interface we use in coeffs.h for ClearDenominators and ClearContent.
#define FALSE
Definition auxiliary.h:97
int p
Definition cfModGcd.cc:4086
Base polynomial enumerator for simple iteration over terms of polynomials.
CBasePolyEnumerator(poly p=NULL)
This enumerator is an empty polynomial by default.
virtual void Reset()
Sets the position marker to the leading term.
friend class CRecursivePolyCoeffsEnumerator
virtual bool MoveNext()
Advances the position to the next term of the polynomial. returns true if the position marker was suc...
static const spolyrec m_prevposition_struct
tag for "-1" position
virtual bool IsValid() const
Current position is inside the collection (not -1 or past the end)
poly m_poly
essentially immutable original iterable object
void Reset(poly p)
Reset this polynomial Enumerator with a different input polynomial.
poly m_position
current position in the iterable object
virtual IPolyCoeffsEnumerator::reference Current()
Gets the current element in the collection (read and write).
virtual IPolyCoeffsEnumerator::const_reference Current() const
Gets the current element in the collection (read only).
IPolyCoeffsEnumerator & m_global_enumerator
iterates the input polynomial
virtual bool MoveNext()
Advances the enumerator to the next element of the collection. returns true if the enumerator was suc...
virtual IPolyCoeffsEnumerator::reference Current()
Gets the current element in the collection (read and write).
virtual bool IsValid() const
Current position is inside the collection (not -1 or past the end)
virtual IPolyCoeffsEnumerator::const_reference Current() const
Gets the current element in the collection (read only).
CBasePolyEnumerator m_local_enumerator
iterates the current coeff. of m_global_enumerator
virtual void Reset()
Sets the enumerator to its initial position: -1, which is before the first element in the collection.
CRecursivePolyCoeffsEnumerator(IPolyCoeffsEnumerator &itr)
NOTE: careful: don't destruct the input enumerator before doing it with this one.....
const value_type & const_reference
Definition Enumerator.h:86
value_type & reference
Definition Enumerator.h:85
IBaseEnumerator(const IBaseEnumerator &)
disable copy constructor and assignment operator
Templated enumerator interface for simple iteration over a generic collection of T's.
Definition Enumerator.h:125
#define assume(x)
Definition mod2.h:389
#define pNext(p)
Definition monomials.h:36
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition monomials.h:44
#define NULL
Definition omList.c:12
static poly convert(const number &n)