|
Collection of Concrete Vector Reduction/Transformation Operator Implementations Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // RTOp: Interfaces and Support Software for Vector Reduction Transformation 00005 // Operations 00006 // Copyright (2006) Sandia Corporation 00007 // 00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00009 // license for use of this work by or on behalf of the U.S. Government. 00010 // 00011 // This library is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Lesser General Public License as 00013 // published by the Free Software Foundation; either version 2.1 of the 00014 // License, or (at your option) any later version. 00015 // 00016 // This library is distributed in the hope that it will be useful, but 00017 // WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 // Lesser General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Lesser General Public 00022 // License along with this library; if not, write to the Free Software 00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00024 // USA 00025 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 00026 // 00027 // *********************************************************************** 00028 // @HEADER 00029 00030 #ifndef RTOPPACK_ROP_MIN_INDEX_HPP 00031 #define RTOPPACK_ROP_MIN_INDEX_HPP 00032 00033 00034 #include "RTOpPack_RTOpTHelpers.hpp" 00035 00036 00037 namespace RTOpPack { 00038 00039 00041 template<class Scalar> 00042 class ROpMinIndexEleWiseReductionOp { 00043 public: 00045 void operator()(const index_type i, const Scalar &v0, 00046 ScalarIndex<Scalar> &reduct) const 00047 { 00048 if( 00049 v0 < reduct.scalar 00050 || 00051 ( v0 == reduct.scalar && i < reduct.index ) 00052 ) 00053 { 00054 reduct = ScalarIndex<Scalar>(v0, i); 00055 } 00056 } 00057 }; 00058 00059 00061 template<class Scalar> 00062 class ROpMinIndexReductObjReductionOp { 00063 public: 00065 void operator()( 00066 const ScalarIndex<Scalar>& in_reduct, ScalarIndex<Scalar>& inout_reduct 00067 ) const 00068 { 00069 if( 00070 in_reduct.scalar < inout_reduct.scalar 00071 || 00072 ( 00073 in_reduct.scalar == inout_reduct.scalar 00074 && 00075 in_reduct.index < inout_reduct.index 00076 ) 00077 ) 00078 { 00079 inout_reduct = in_reduct; 00080 } 00081 } 00082 }; 00083 00084 00090 template<class Scalar> 00091 class ROpMinIndex 00092 : public ROp_1_CoordVariantScalarReduction< 00093 Scalar, 00094 ScalarIndex<Scalar>, 00095 ROpMinIndexEleWiseReductionOp<Scalar>, 00096 ROpMinIndexReductObjReductionOp<Scalar> > 00097 { 00098 public: 00100 ROpMinIndex() 00101 { 00102 this->setOpNameBase("ROpMinIndex"); 00103 this->initReductObjValue( 00104 ScalarIndex<Scalar>(+ScalarTraits<Scalar>::rmax(), -1)); 00105 } 00107 ScalarIndex<Scalar> operator()(const ReductTarget& reduct_obj) const 00108 { return this->getRawVal(reduct_obj); } 00109 }; 00110 00111 00112 } // namespace RTOpPack 00113 00114 00115 #endif // RTOPPACK_ROP_MIN_INDEX_HPP
1.7.4