1 /* Frobby: Software for monomial ideal computations.
2    Copyright (C) 2007 Bjarke Hammersholt Roune (www.broune.com)
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8 
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see http://www.gnu.org/licenses/.
16 */
17 #include "stdinc.h"
18 #include "TotalDegreeCoefTermConsumer.h"
19 
20 #include "CoefBigTermConsumer.h"
21 #include "TermTranslator.h"
22 #include "Term.h"
23 
24 TotalDegreeCoefTermConsumer::
TotalDegreeCoefTermConsumer(auto_ptr<CoefBigTermConsumer> consumer,const TermTranslator & translator)25 TotalDegreeCoefTermConsumer(auto_ptr<CoefBigTermConsumer> consumer,
26                             const TermTranslator& translator):
27   _consumer(*consumer),
28   _consumerOwner(consumer),
29   _translator(translator) {
30   ASSERT(_consumerOwner.get() != 0);
31 }
32 
33 TotalDegreeCoefTermConsumer::
TotalDegreeCoefTermConsumer(CoefBigTermConsumer & consumer,const TermTranslator & translator)34 TotalDegreeCoefTermConsumer(CoefBigTermConsumer& consumer,
35                             const TermTranslator& translator):
36   _consumer(consumer),
37   _translator(translator) {
38 }
39 
consumeRing(const VarNames & names)40 void TotalDegreeCoefTermConsumer::consumeRing(const VarNames& names) {
41   // Do nothing since taking the total degree discards the original
42   // ring.
43 }
44 
beginConsuming()45 void TotalDegreeCoefTermConsumer::beginConsuming() {
46 }
47 
consume(const mpz_class & coef,const Term & term)48 void TotalDegreeCoefTermConsumer::consume(const mpz_class& coef,
49                                           const Term& term) {
50   ASSERT(term.getVarCount() == _translator.getVarCount());
51   if (coef == 0)
52     return;
53 
54   // Compute total degree using _tmp.
55   _tmp = 0;
56   for (size_t var = 0; var < term.getVarCount(); ++var)
57     _tmp += _translator.getExponent(var, term);
58 
59   _poly.add(coef, _tmp);
60 }
61 
doneConsuming()62 void TotalDegreeCoefTermConsumer::doneConsuming() {
63   _poly.feedTo(_consumer, true);
64 }
65