1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGBINARYOPS_HPP 2*35238bceSAndroid Build Coastguard Worker #define _RSGBINARYOPS_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Random Shader Generator 5*35238bceSAndroid Build Coastguard Worker * ---------------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Binary operators. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "rsgExpression.hpp" 28*35238bceSAndroid Build Coastguard Worker 29*35238bceSAndroid Build Coastguard Worker namespace rsg 30*35238bceSAndroid Build Coastguard Worker { 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker enum Associativity 33*35238bceSAndroid Build Coastguard Worker { 34*35238bceSAndroid Build Coastguard Worker ASSOCIATIVITY_LEFT = 0, 35*35238bceSAndroid Build Coastguard Worker ASSOCIATIVITY_RIGHT, 36*35238bceSAndroid Build Coastguard Worker 37*35238bceSAndroid Build Coastguard Worker ASSOCIATIVITY_LAST 38*35238bceSAndroid Build Coastguard Worker }; 39*35238bceSAndroid Build Coastguard Worker 40*35238bceSAndroid Build Coastguard Worker template <int Precedence, Associativity Assoc> 41*35238bceSAndroid Build Coastguard Worker class BinaryOp : public Expression 42*35238bceSAndroid Build Coastguard Worker { 43*35238bceSAndroid Build Coastguard Worker public: 44*35238bceSAndroid Build Coastguard Worker BinaryOp(Token::Type operatorToken); 45*35238bceSAndroid Build Coastguard Worker virtual ~BinaryOp(void); 46*35238bceSAndroid Build Coastguard Worker 47*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 48*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 49*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &execCtx); getValue(void) const50*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 51*35238bceSAndroid Build Coastguard Worker { 52*35238bceSAndroid Build Coastguard Worker return m_value.getValue(m_type); 53*35238bceSAndroid Build Coastguard Worker } 54*35238bceSAndroid Build Coastguard Worker 55*35238bceSAndroid Build Coastguard Worker virtual void evaluate(ExecValueAccess dst, ExecConstValueAccess a, ExecConstValueAccess b) = DE_NULL; 56*35238bceSAndroid Build Coastguard Worker 57*35238bceSAndroid Build Coastguard Worker protected: 58*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 59*35238bceSAndroid Build Coastguard Worker 60*35238bceSAndroid Build Coastguard Worker Token::Type m_operator; 61*35238bceSAndroid Build Coastguard Worker VariableType m_type; 62*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 63*35238bceSAndroid Build Coastguard Worker 64*35238bceSAndroid Build Coastguard Worker ValueRange m_leftValueRange; 65*35238bceSAndroid Build Coastguard Worker ValueRange m_rightValueRange; 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker Expression *m_leftValueExpr; 68*35238bceSAndroid Build Coastguard Worker Expression *m_rightValueExpr; 69*35238bceSAndroid Build Coastguard Worker }; 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Worker template <int Precedence, bool Float, bool Int, bool Bool, class ComputeValueRange, class EvaluateComp> 72*35238bceSAndroid Build Coastguard Worker class BinaryVecOp : public BinaryOp<Precedence, ASSOCIATIVITY_LEFT> 73*35238bceSAndroid Build Coastguard Worker { 74*35238bceSAndroid Build Coastguard Worker public: 75*35238bceSAndroid Build Coastguard Worker BinaryVecOp(GeneratorState &state, Token::Type operatorToken, ConstValueRangeAccess valueRange); 76*35238bceSAndroid Build Coastguard Worker virtual ~BinaryVecOp(void); 77*35238bceSAndroid Build Coastguard Worker 78*35238bceSAndroid Build Coastguard Worker void evaluate(ExecValueAccess dst, ExecConstValueAccess a, ExecConstValueAccess b); 79*35238bceSAndroid Build Coastguard Worker }; 80*35238bceSAndroid Build Coastguard Worker 81*35238bceSAndroid Build Coastguard Worker struct ComputeMulRange 82*35238bceSAndroid Build Coastguard Worker { 83*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, float dstMin, float dstMax, float &aMin, float &aMax, float &bMin, 84*35238bceSAndroid Build Coastguard Worker float &bMax) const; 85*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, int dstMin, int dstMax, int &aMin, int &aMax, int &bMin, int &bMax) const; operator ()rsg::ComputeMulRange86*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &, bool, bool, bool &, bool &, bool &, bool &) const 87*35238bceSAndroid Build Coastguard Worker { 88*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false); 89*35238bceSAndroid Build Coastguard Worker } 90*35238bceSAndroid Build Coastguard Worker }; 91*35238bceSAndroid Build Coastguard Worker 92*35238bceSAndroid Build Coastguard Worker struct EvaluateMul 93*35238bceSAndroid Build Coastguard Worker { 94*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateMul95*35238bceSAndroid Build Coastguard Worker inline T operator()(T a, T b) const 96*35238bceSAndroid Build Coastguard Worker { 97*35238bceSAndroid Build Coastguard Worker return a * b; 98*35238bceSAndroid Build Coastguard Worker } 99*35238bceSAndroid Build Coastguard Worker }; 100*35238bceSAndroid Build Coastguard Worker 101*35238bceSAndroid Build Coastguard Worker typedef BinaryVecOp<4, true, true, false, ComputeMulRange, EvaluateMul> MulBase; 102*35238bceSAndroid Build Coastguard Worker 103*35238bceSAndroid Build Coastguard Worker class MulOp : public MulBase 104*35238bceSAndroid Build Coastguard Worker { 105*35238bceSAndroid Build Coastguard Worker public: 106*35238bceSAndroid Build Coastguard Worker MulOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~MulOp(void)107*35238bceSAndroid Build Coastguard Worker virtual ~MulOp(void) 108*35238bceSAndroid Build Coastguard Worker { 109*35238bceSAndroid Build Coastguard Worker } 110*35238bceSAndroid Build Coastguard Worker 111*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 112*35238bceSAndroid Build Coastguard Worker }; 113*35238bceSAndroid Build Coastguard Worker 114*35238bceSAndroid Build Coastguard Worker struct ComputeAddRange 115*35238bceSAndroid Build Coastguard Worker { 116*35238bceSAndroid Build Coastguard Worker template <typename T> 117*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, T dstMin, T dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const; 118*35238bceSAndroid Build Coastguard Worker }; 119*35238bceSAndroid Build Coastguard Worker 120*35238bceSAndroid Build Coastguard Worker struct EvaluateAdd 121*35238bceSAndroid Build Coastguard Worker { 122*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateAdd123*35238bceSAndroid Build Coastguard Worker inline T operator()(T a, T b) const 124*35238bceSAndroid Build Coastguard Worker { 125*35238bceSAndroid Build Coastguard Worker return a + b; 126*35238bceSAndroid Build Coastguard Worker } 127*35238bceSAndroid Build Coastguard Worker }; 128*35238bceSAndroid Build Coastguard Worker 129*35238bceSAndroid Build Coastguard Worker typedef BinaryVecOp<5, true, true, false, ComputeAddRange, EvaluateAdd> AddBase; 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker class AddOp : public AddBase 132*35238bceSAndroid Build Coastguard Worker { 133*35238bceSAndroid Build Coastguard Worker public: 134*35238bceSAndroid Build Coastguard Worker AddOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~AddOp(void)135*35238bceSAndroid Build Coastguard Worker virtual ~AddOp(void) 136*35238bceSAndroid Build Coastguard Worker { 137*35238bceSAndroid Build Coastguard Worker } 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 140*35238bceSAndroid Build Coastguard Worker }; 141*35238bceSAndroid Build Coastguard Worker 142*35238bceSAndroid Build Coastguard Worker struct ComputeSubRange 143*35238bceSAndroid Build Coastguard Worker { 144*35238bceSAndroid Build Coastguard Worker template <typename T> 145*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, T dstMin, T dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const; 146*35238bceSAndroid Build Coastguard Worker }; 147*35238bceSAndroid Build Coastguard Worker 148*35238bceSAndroid Build Coastguard Worker struct EvaluateSub 149*35238bceSAndroid Build Coastguard Worker { 150*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateSub151*35238bceSAndroid Build Coastguard Worker inline T operator()(T a, T b) const 152*35238bceSAndroid Build Coastguard Worker { 153*35238bceSAndroid Build Coastguard Worker return a - b; 154*35238bceSAndroid Build Coastguard Worker } 155*35238bceSAndroid Build Coastguard Worker }; 156*35238bceSAndroid Build Coastguard Worker 157*35238bceSAndroid Build Coastguard Worker typedef BinaryVecOp<5, true, true, false, ComputeSubRange, EvaluateSub> SubBase; 158*35238bceSAndroid Build Coastguard Worker 159*35238bceSAndroid Build Coastguard Worker class SubOp : public SubBase 160*35238bceSAndroid Build Coastguard Worker { 161*35238bceSAndroid Build Coastguard Worker public: 162*35238bceSAndroid Build Coastguard Worker SubOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~SubOp(void)163*35238bceSAndroid Build Coastguard Worker virtual ~SubOp(void) 164*35238bceSAndroid Build Coastguard Worker { 165*35238bceSAndroid Build Coastguard Worker } 166*35238bceSAndroid Build Coastguard Worker 167*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 168*35238bceSAndroid Build Coastguard Worker }; 169*35238bceSAndroid Build Coastguard Worker 170*35238bceSAndroid Build Coastguard Worker /* Template for Relational Operators. */ 171*35238bceSAndroid Build Coastguard Worker 172*35238bceSAndroid Build Coastguard Worker template <class ComputeValueRange, class EvaluateComp> 173*35238bceSAndroid Build Coastguard Worker class RelationalOp : public BinaryOp<7, ASSOCIATIVITY_LEFT> 174*35238bceSAndroid Build Coastguard Worker { 175*35238bceSAndroid Build Coastguard Worker public: 176*35238bceSAndroid Build Coastguard Worker RelationalOp(GeneratorState &state, Token::Type operatorToken, ConstValueRangeAccess valueRange); 177*35238bceSAndroid Build Coastguard Worker virtual ~RelationalOp(void); 178*35238bceSAndroid Build Coastguard Worker 179*35238bceSAndroid Build Coastguard Worker void evaluate(ExecValueAccess dst, ExecConstValueAccess a, ExecConstValueAccess b); 180*35238bceSAndroid Build Coastguard Worker 181*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 182*35238bceSAndroid Build Coastguard Worker }; 183*35238bceSAndroid Build Coastguard Worker 184*35238bceSAndroid Build Coastguard Worker /* Less Than. */ 185*35238bceSAndroid Build Coastguard Worker 186*35238bceSAndroid Build Coastguard Worker struct ComputeLessThanRange 187*35238bceSAndroid Build Coastguard Worker { 188*35238bceSAndroid Build Coastguard Worker template <typename T> 189*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, bool dstMin, bool dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const; 190*35238bceSAndroid Build Coastguard Worker }; 191*35238bceSAndroid Build Coastguard Worker 192*35238bceSAndroid Build Coastguard Worker struct EvaluateLessThan 193*35238bceSAndroid Build Coastguard Worker { 194*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateLessThan195*35238bceSAndroid Build Coastguard Worker inline bool operator()(T a, T b) const 196*35238bceSAndroid Build Coastguard Worker { 197*35238bceSAndroid Build Coastguard Worker return a < b; 198*35238bceSAndroid Build Coastguard Worker } 199*35238bceSAndroid Build Coastguard Worker }; 200*35238bceSAndroid Build Coastguard Worker 201*35238bceSAndroid Build Coastguard Worker typedef RelationalOp<ComputeLessThanRange, EvaluateLessThan> LessThanBase; 202*35238bceSAndroid Build Coastguard Worker 203*35238bceSAndroid Build Coastguard Worker class LessThanOp : public LessThanBase 204*35238bceSAndroid Build Coastguard Worker { 205*35238bceSAndroid Build Coastguard Worker public: 206*35238bceSAndroid Build Coastguard Worker LessThanOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~LessThanOp(void)207*35238bceSAndroid Build Coastguard Worker virtual ~LessThanOp(void) 208*35238bceSAndroid Build Coastguard Worker { 209*35238bceSAndroid Build Coastguard Worker } 210*35238bceSAndroid Build Coastguard Worker 211*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 212*35238bceSAndroid Build Coastguard Worker }; 213*35238bceSAndroid Build Coastguard Worker 214*35238bceSAndroid Build Coastguard Worker /* Less or Equal. */ 215*35238bceSAndroid Build Coastguard Worker 216*35238bceSAndroid Build Coastguard Worker struct ComputeLessOrEqualRange 217*35238bceSAndroid Build Coastguard Worker { 218*35238bceSAndroid Build Coastguard Worker template <typename T> 219*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, bool dstMin, bool dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const; 220*35238bceSAndroid Build Coastguard Worker }; 221*35238bceSAndroid Build Coastguard Worker 222*35238bceSAndroid Build Coastguard Worker struct EvaluateLessOrEqual 223*35238bceSAndroid Build Coastguard Worker { 224*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateLessOrEqual225*35238bceSAndroid Build Coastguard Worker inline bool operator()(T a, T b) const 226*35238bceSAndroid Build Coastguard Worker { 227*35238bceSAndroid Build Coastguard Worker return a <= b; 228*35238bceSAndroid Build Coastguard Worker } 229*35238bceSAndroid Build Coastguard Worker }; 230*35238bceSAndroid Build Coastguard Worker 231*35238bceSAndroid Build Coastguard Worker typedef RelationalOp<ComputeLessOrEqualRange, EvaluateLessOrEqual> LessOrEqualBase; 232*35238bceSAndroid Build Coastguard Worker 233*35238bceSAndroid Build Coastguard Worker class LessOrEqualOp : public LessOrEqualBase 234*35238bceSAndroid Build Coastguard Worker { 235*35238bceSAndroid Build Coastguard Worker public: 236*35238bceSAndroid Build Coastguard Worker LessOrEqualOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~LessOrEqualOp(void)237*35238bceSAndroid Build Coastguard Worker virtual ~LessOrEqualOp(void) 238*35238bceSAndroid Build Coastguard Worker { 239*35238bceSAndroid Build Coastguard Worker } 240*35238bceSAndroid Build Coastguard Worker 241*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 242*35238bceSAndroid Build Coastguard Worker }; 243*35238bceSAndroid Build Coastguard Worker 244*35238bceSAndroid Build Coastguard Worker /* Greater Than. */ 245*35238bceSAndroid Build Coastguard Worker 246*35238bceSAndroid Build Coastguard Worker struct ComputeGreaterThanRange 247*35238bceSAndroid Build Coastguard Worker { 248*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::ComputeGreaterThanRange249*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, bool dstMin, bool dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const 250*35238bceSAndroid Build Coastguard Worker { 251*35238bceSAndroid Build Coastguard Worker ComputeLessThanRange()(rnd, dstMin, dstMax, bMin, bMax, aMin, aMax); 252*35238bceSAndroid Build Coastguard Worker } 253*35238bceSAndroid Build Coastguard Worker }; 254*35238bceSAndroid Build Coastguard Worker 255*35238bceSAndroid Build Coastguard Worker struct EvaluateGreaterThan 256*35238bceSAndroid Build Coastguard Worker { 257*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateGreaterThan258*35238bceSAndroid Build Coastguard Worker inline bool operator()(T a, T b) const 259*35238bceSAndroid Build Coastguard Worker { 260*35238bceSAndroid Build Coastguard Worker return a > b; 261*35238bceSAndroid Build Coastguard Worker } 262*35238bceSAndroid Build Coastguard Worker }; 263*35238bceSAndroid Build Coastguard Worker 264*35238bceSAndroid Build Coastguard Worker typedef RelationalOp<ComputeGreaterThanRange, EvaluateGreaterThan> GreaterThanBase; 265*35238bceSAndroid Build Coastguard Worker 266*35238bceSAndroid Build Coastguard Worker class GreaterThanOp : public GreaterThanBase 267*35238bceSAndroid Build Coastguard Worker { 268*35238bceSAndroid Build Coastguard Worker public: 269*35238bceSAndroid Build Coastguard Worker GreaterThanOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~GreaterThanOp(void)270*35238bceSAndroid Build Coastguard Worker virtual ~GreaterThanOp(void) 271*35238bceSAndroid Build Coastguard Worker { 272*35238bceSAndroid Build Coastguard Worker } 273*35238bceSAndroid Build Coastguard Worker 274*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 275*35238bceSAndroid Build Coastguard Worker }; 276*35238bceSAndroid Build Coastguard Worker 277*35238bceSAndroid Build Coastguard Worker /* Greater or Equal. */ 278*35238bceSAndroid Build Coastguard Worker 279*35238bceSAndroid Build Coastguard Worker struct ComputeGreaterOrEqualRange 280*35238bceSAndroid Build Coastguard Worker { 281*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::ComputeGreaterOrEqualRange282*35238bceSAndroid Build Coastguard Worker void operator()(de::Random &rnd, bool dstMin, bool dstMax, T &aMin, T &aMax, T &bMin, T &bMax) const 283*35238bceSAndroid Build Coastguard Worker { 284*35238bceSAndroid Build Coastguard Worker ComputeLessOrEqualRange()(rnd, dstMin, dstMax, bMin, bMax, aMin, aMax); 285*35238bceSAndroid Build Coastguard Worker } 286*35238bceSAndroid Build Coastguard Worker }; 287*35238bceSAndroid Build Coastguard Worker 288*35238bceSAndroid Build Coastguard Worker struct EvaluateGreaterOrEqual 289*35238bceSAndroid Build Coastguard Worker { 290*35238bceSAndroid Build Coastguard Worker template <typename T> operator ()rsg::EvaluateGreaterOrEqual291*35238bceSAndroid Build Coastguard Worker inline bool operator()(T a, T b) const 292*35238bceSAndroid Build Coastguard Worker { 293*35238bceSAndroid Build Coastguard Worker return a >= b; 294*35238bceSAndroid Build Coastguard Worker } 295*35238bceSAndroid Build Coastguard Worker }; 296*35238bceSAndroid Build Coastguard Worker 297*35238bceSAndroid Build Coastguard Worker typedef RelationalOp<ComputeGreaterOrEqualRange, EvaluateGreaterOrEqual> GreaterOrEqualBase; 298*35238bceSAndroid Build Coastguard Worker 299*35238bceSAndroid Build Coastguard Worker class GreaterOrEqualOp : public GreaterOrEqualBase 300*35238bceSAndroid Build Coastguard Worker { 301*35238bceSAndroid Build Coastguard Worker public: 302*35238bceSAndroid Build Coastguard Worker GreaterOrEqualOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~GreaterOrEqualOp(void)303*35238bceSAndroid Build Coastguard Worker virtual ~GreaterOrEqualOp(void) 304*35238bceSAndroid Build Coastguard Worker { 305*35238bceSAndroid Build Coastguard Worker } 306*35238bceSAndroid Build Coastguard Worker 307*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 308*35238bceSAndroid Build Coastguard Worker }; 309*35238bceSAndroid Build Coastguard Worker 310*35238bceSAndroid Build Coastguard Worker /* Equality comparison. */ 311*35238bceSAndroid Build Coastguard Worker 312*35238bceSAndroid Build Coastguard Worker template <bool IsEqual> 313*35238bceSAndroid Build Coastguard Worker class EqualityComparisonOp : public BinaryOp<8, ASSOCIATIVITY_LEFT> 314*35238bceSAndroid Build Coastguard Worker { 315*35238bceSAndroid Build Coastguard Worker public: 316*35238bceSAndroid Build Coastguard Worker EqualityComparisonOp(GeneratorState &state, ConstValueRangeAccess valueRange); ~EqualityComparisonOp(void)317*35238bceSAndroid Build Coastguard Worker virtual ~EqualityComparisonOp(void) 318*35238bceSAndroid Build Coastguard Worker { 319*35238bceSAndroid Build Coastguard Worker } 320*35238bceSAndroid Build Coastguard Worker 321*35238bceSAndroid Build Coastguard Worker void evaluate(ExecValueAccess dst, ExecConstValueAccess a, ExecConstValueAccess b); 322*35238bceSAndroid Build Coastguard Worker 323*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 324*35238bceSAndroid Build Coastguard Worker }; 325*35238bceSAndroid Build Coastguard Worker 326*35238bceSAndroid Build Coastguard Worker // \note Since template implementation is in .cpp we have to reference specialized constructor and static functions from there. 327*35238bceSAndroid Build Coastguard Worker class EqualOp : public EqualityComparisonOp<true> 328*35238bceSAndroid Build Coastguard Worker { 329*35238bceSAndroid Build Coastguard Worker public: 330*35238bceSAndroid Build Coastguard Worker EqualOp(GeneratorState &state, ConstValueRangeAccess valueRange); 331*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 332*35238bceSAndroid Build Coastguard Worker }; 333*35238bceSAndroid Build Coastguard Worker 334*35238bceSAndroid Build Coastguard Worker class NotEqualOp : public EqualityComparisonOp<false> 335*35238bceSAndroid Build Coastguard Worker { 336*35238bceSAndroid Build Coastguard Worker public: 337*35238bceSAndroid Build Coastguard Worker NotEqualOp(GeneratorState &state, ConstValueRangeAccess valueRange); 338*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 339*35238bceSAndroid Build Coastguard Worker }; 340*35238bceSAndroid Build Coastguard Worker 341*35238bceSAndroid Build Coastguard Worker } // namespace rsg 342*35238bceSAndroid Build Coastguard Worker 343*35238bceSAndroid Build Coastguard Worker #endif // _RSGBINARYOPS_HPP 344