Teuchos - Trilinos Tools Package Version of the Day
Teuchos_ReductionOpHelpers.hpp
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 //                    Teuchos: Common Tools Package
00005 //                 Copyright (2004) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #ifndef TEUCHOS_REDUCTION_OP_HELPERS_HPP
00043 #define TEUCHOS_REDUCTION_OP_HELPERS_HPP
00044 
00045 #include "Teuchos_ReductionOp.hpp"
00046 #include "Teuchos_SerializationTraitsHelpers.hpp"
00047 #include "Teuchos_SerializerHelpers.hpp"
00048 
00049 namespace Teuchos {
00050 
00057 template<typename Ordinal, typename T>
00058 class CharToValueTypeReductionOp : public ValueTypeReductionOp<Ordinal,char>
00059 {
00060 public:
00062   CharToValueTypeReductionOp(
00063     const RCP<const ValueTypeReductionOp<Ordinal,T> >  &reductOp
00064     );
00066   void reduce(
00067     const Ordinal     charCount
00068     ,const char       charInBuffer[]
00069     ,char             charInoutBuffer[]
00070     ) const;
00071 private:
00072   RCP<const ValueTypeReductionOp<Ordinal,T> >  reductOp_;
00073   // Not defined and not to be called!
00074   CharToValueTypeReductionOp();
00075   CharToValueTypeReductionOp(const CharToValueTypeReductionOp&);
00076   CharToValueTypeReductionOp& operator=(const CharToValueTypeReductionOp&);
00077 };
00078 
00085 template<typename Ordinal, typename T>
00086 class CharToReferenceTypeReductionOp : public ValueTypeReductionOp<Ordinal,char>
00087 {
00088 public:
00090   CharToReferenceTypeReductionOp(
00091     const RCP<const Serializer<Ordinal,T> >                 &serializer
00092     ,const RCP<const ReferenceTypeReductionOp<Ordinal,T> >  &reductOp
00093     );
00095   void reduce(
00096     const Ordinal     charCount
00097     ,const char       charInBuffer[]
00098     ,char             charInoutBuffer[]
00099     ) const;
00100 private:
00101   RCP<const Serializer<Ordinal,T> >                serializer_;
00102   RCP<const ReferenceTypeReductionOp<Ordinal,T> >  reductOp_;
00103   // Not defined and not to be called!
00104   CharToReferenceTypeReductionOp();
00105   CharToReferenceTypeReductionOp(const CharToReferenceTypeReductionOp&);
00106   CharToReferenceTypeReductionOp& operator=(const CharToReferenceTypeReductionOp&);
00107 };
00108 
00109 // /////////////////////////////////////
00110 // Template implementations
00111 
00112 //
00113 // CharToValueTypeReductionOp
00114 //
00115 
00116 template<typename Ordinal, typename T>
00117 CharToValueTypeReductionOp<Ordinal,T>::CharToValueTypeReductionOp(
00118   const RCP<const ValueTypeReductionOp<Ordinal,T> >  &reductOp
00119   )
00120   :reductOp_(reductOp)
00121 {}
00122 
00123 template<typename Ordinal, typename T>
00124 void CharToValueTypeReductionOp<Ordinal,T>::reduce(
00125   const Ordinal     charCount
00126   ,const char       charInBuffer[]
00127   ,char             charInoutBuffer[]
00128   ) const
00129 {
00130   ConstValueTypeDeserializationBuffer<Ordinal,T>
00131     inBuffer(charCount,charInBuffer);
00132   ValueTypeDeserializationBuffer<Ordinal,T>
00133     inoutBuffer(charCount,charInoutBuffer);
00134   reductOp_->reduce(
00135     inBuffer.getCount(),inBuffer.getBuffer(),inoutBuffer.getBuffer()
00136     );
00137 }
00138 
00139 //
00140 // CharToReferenceTypeReductionOp
00141 //
00142 
00143 template<typename Ordinal, typename T>
00144 CharToReferenceTypeReductionOp<Ordinal,T>::CharToReferenceTypeReductionOp(
00145   const RCP<const Serializer<Ordinal,T> >                 &serializer
00146   ,const RCP<const ReferenceTypeReductionOp<Ordinal,T> >  &reductOp
00147   )
00148   :serializer_(serializer), reductOp_(reductOp)
00149 {}
00150 
00151 template<typename Ordinal, typename T>
00152 void CharToReferenceTypeReductionOp<Ordinal,T>::reduce(
00153   const Ordinal     charCount
00154   ,const char       charInBuffer[]
00155   ,char             charInoutBuffer[]
00156   ) const
00157 {
00158   ConstReferenceTypeDeserializationBuffer<Ordinal,T>
00159     inBuffer(*serializer_,charCount,charInBuffer);
00160   ReferenceTypeDeserializationBuffer<Ordinal,T>
00161     inoutBuffer(*serializer_,charCount,charInoutBuffer);
00162   reductOp_->reduce(
00163     inBuffer.getCount(),inBuffer.getBuffer(),inoutBuffer.getBuffer()
00164     );
00165 }
00166 
00167 } // namespace Teuchos
00168 
00169 #endif // TEUCHOS_REDUCTION_OP_HELPERS_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines