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 desn't 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 {
171 }
172
173 public:
174
175 /// NOTE: carefull: 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 {
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 followig 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 {
205 }
206
207 /// Gets the current element in the collection (read and write).
209 {
210 assume( IsValid() );
212 }
213
214 /// Gets the current element in the collection (read only).
216 {
217 assume( IsValid() );
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:96
int p
Definition: cfModGcd.cc:4078
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.
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
This is a polynomial enumerator for simple iteration over coefficients of polynomials.
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).
go into polynomials over an alg. extension recursively
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: carefull: 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
virtual reference Current()=0
Gets the current element in the collection (read and write).
Base enumerator interface for simple iteration over a generic collection.
Definition: Enumerator.h:44
virtual bool IsValid() const =0
Current position is inside the collection (not -1 or past the end)
virtual void Reset()=0
Sets the enumerator to its initial position: -1, which is before the first element in the collection.
virtual bool MoveNext()=0
Advances the enumerator to the next element of the collection. returns true if the enumerator was suc...
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)