1 /* 2 This file is part of GNU APL, a free implementation of the 3 ISO/IEC Standard 13751, "Programming Language APL, Extended" 4 5 Copyright (C) 2008-2015 Dr. Jürgen Sauermann 6 7 This program is free software: you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation, either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifndef __BIF_OPER1_REDUCE_HH_DEFINED__ 22 #define __BIF_OPER1_REDUCE_HH_DEFINED__ 23 24 #include "PrimitiveOperator.hh" 25 26 //----------------------------------------------------------------------------- 27 /** Primitive operator reduce (common part for all reducr variants) 28 */ 29 /// Base class for / and ⌿ 30 class Bif_REDUCE : public PrimitiveOperator 31 { 32 public: 33 /// Constructor. Bif_REDUCE(TokenTag tag)34 Bif_REDUCE(TokenTag tag) : PrimitiveOperator(tag) {} 35 36 /// common implementation of reduce() and reduce_n_wise. 37 static Token do_reduce(const Shape & shape_Z, const Shape3 & Z3, ShapeItem a, 38 Function * LO, Value_P B, ShapeItem bm); 39 40 protected: 41 /// Replicate B according to A along axis. 42 Token replicate(Value_P A, Value_P B, uAxis axis); 43 44 /// LO-reduce B along axis. 45 Token reduce(Token & _LO, Value_P B, uAxis axis); 46 47 /// LO-reduce B n-wise along axis. 48 Token reduce_n_wise(Value_P A, Token & _LO, Value_P B, uAxis axis); 49 50 protected: 51 /// overloaded Function::may_push_SI() may_push_SI() const52 virtual bool may_push_SI() const 53 { return true; } 54 }; 55 //----------------------------------------------------------------------------- 56 /** Primitive operator reduce along last axis. 57 */ 58 /// The class implementing / 59 class Bif_OPER1_REDUCE : public Bif_REDUCE 60 { 61 public: 62 /// Constructor. Bif_OPER1_REDUCE()63 Bif_OPER1_REDUCE() : Bif_REDUCE(TOK_OPER1_REDUCE) {} 64 65 /// Overloaded Function::eval_AB(). eval_AB(Value_P A,Value_P B)66 virtual Token eval_AB(Value_P A, Value_P B) 67 { return replicate(A, B, B->get_rank() - 1); } 68 69 /// Overloaded Function::eval_AXB(). 70 virtual Token eval_AXB(Value_P A, Value_P X, Value_P B); 71 72 /// Overloaded Function::eval_LB(). eval_LB(Token & LO,Value_P B)73 virtual Token eval_LB(Token & LO, Value_P B) 74 { return reduce(LO, B, B->get_rank() - 1); } 75 76 /// Overloaded Function::eval_ALB(). eval_ALB(Value_P A,Token & LO,Value_P B)77 virtual Token eval_ALB(Value_P A, Token & LO, Value_P B) 78 { return reduce_n_wise(A, LO, B, B->get_rank() - 1); } 79 80 /// Overloaded Function::eval_LXB(). 81 virtual Token eval_LXB(Token & LO, Value_P X, Value_P B); 82 83 /// Overloaded Function::eval_ALXB(). 84 virtual Token eval_ALXB(Value_P A, Token & LO, Value_P X, Value_P B); 85 86 static Bif_OPER1_REDUCE * fun; ///< Built-in function. 87 static Bif_OPER1_REDUCE _fun; ///< Built-in function. 88 89 protected: 90 }; 91 //----------------------------------------------------------------------------- 92 /** Primitive operator reduce along first axis. 93 */ 94 /// The class implementing ⌿ 95 class Bif_OPER1_REDUCE1 : public Bif_REDUCE 96 { 97 public: 98 /// Constructor. Bif_OPER1_REDUCE1()99 Bif_OPER1_REDUCE1() : Bif_REDUCE(TOK_OPER1_REDUCE1) {} 100 101 /// Overloaded Function::eval_AB(). eval_AB(Value_P A,Value_P B)102 virtual Token eval_AB(Value_P A, Value_P B) 103 { return replicate(A, B, 0); } 104 105 /// Overloaded Function::eval_AXB(). 106 virtual Token eval_AXB(Value_P A, Value_P X, Value_P B); 107 108 /// Overloaded Function::eval_LB(). eval_LB(Token & LO,Value_P B)109 virtual Token eval_LB(Token & LO, Value_P B) 110 { return reduce(LO, B, 0); } 111 112 /// Overloaded Function::eval_ALB(). eval_ALB(Token & LO,Value_P B)113 virtual Token eval_ALB(Token & LO, Value_P B) 114 { return reduce(LO, B, 0); } 115 116 /// Overloaded Function::eval_ALB(). eval_ALB(Value_P A,Token & LO,Value_P B)117 virtual Token eval_ALB(Value_P A, Token & LO, Value_P B) 118 { return reduce_n_wise(A, LO, B, 0); } 119 120 /// Overloaded Function::eval_LXB(). 121 virtual Token eval_LXB(Token & LO, Value_P X, Value_P B); 122 123 /// Overloaded Function::eval_ALXB(). 124 virtual Token eval_ALXB(Value_P A, Token & LO, Value_P X, Value_P B); 125 126 static Bif_OPER1_REDUCE1 * fun; ///< Built-in function. 127 static Bif_OPER1_REDUCE1 _fun; ///< Built-in function. 128 129 protected: 130 }; 131 //----------------------------------------------------------------------------- 132 133 #endif // __BIF_OPER1_REDUCE_HH_DEFINED__ 134