SundanceArrayOfTuples.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
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 Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 #ifndef SUNDANCE_ARRAYOFTUPLES_H
00043 #define SUNDANCE_ARRAYOFTUPLES_H
00044 
00045 #include "Teuchos_Array.hpp"
00046 
00047 namespace Sundance
00048 {
00049   using namespace Teuchos;
00050 
00051   /** 
00052    * Class ArrayOfTuples packs an heterogeneous array of tuples into 
00053    * a single 1D array. 
00054    */
00055   template<class T>
00056     class ArrayOfTuples
00057     {
00058     public:
00059       /** Empty ctor */
00060       ArrayOfTuples();
00061 
00062       /** Constructor specifying the size of each tuple, but not the 
00063        * number of tuples */
00064       ArrayOfTuples(int tupleSize);
00065 
00066       /** Constructor specifying both the size and number of the tuples */
00067       ArrayOfTuples(int numTuples, int tupleSize);
00068 
00069       /** Returns the number of tuples */
00070       int length() const {return numTuples_;}
00071 
00072       /** Returns the size of the tuples */
00073       int tupleSize() const {return tupleSize_;}
00074 
00075       /** Change the number of tuples */
00076       void resize(int newSize) {
00077         numTuples_ = newSize;
00078         data_.resize(numTuples_*tupleSize_);
00079       }
00080 
00081       /** Change the number and size of the tuples */
00082       void resize(int newSize, int newTupleSize) 
00083         {
00084         numTuples_ = newSize;
00085         tupleSize_ = newTupleSize;
00086         data_.resize(numTuples_*tupleSize_);
00087         }
00088 
00089       /** Reserve memory for a number of tuples */
00090       void reserve(int newSize) {data_.reserve(newSize*tupleSize_);}
00091 
00092       /** Specify the size of the tuples */
00093       void setTupleSize(int tupleSize) {tupleSize_ = tupleSize;}
00094 
00095       /** Get the j-th entry in the i-th tuple */
00096       const T& value(int i, int j) const {return data_[i*tupleSize_+j];}
00097 
00098       /** Get the j-th entry in the i-th tuple */
00099       T& value(int i, int j) {return data_[i*tupleSize_+j];}
00100 
00101       /** Append a new tuple to the array */
00102       void append(const Array<T>& x);
00103 
00104       /** Append a new tuple to the array */
00105       void append(const T* x, int n);
00106 
00107     private:
00108 
00109       int numTuples_;
00110       int tupleSize_;
00111 
00112       Array<T> data_;
00113 
00114     };
00115 
00116   template<class T> inline ArrayOfTuples<T>::ArrayOfTuples()
00117     : numTuples_(0), tupleSize_(0), data_()
00118     {;}
00119 
00120   template<class T> inline ArrayOfTuples<T>::ArrayOfTuples(int tupleSize)
00121     : numTuples_(0), tupleSize_(tupleSize), data_()
00122     {;}
00123 
00124   template<class T> inline ArrayOfTuples<T>::ArrayOfTuples(int numTuples, int tupleSize)
00125     : numTuples_(numTuples), tupleSize_(tupleSize), data_(numTuples*tupleSize)
00126     {;}
00127 
00128   template<class T> inline void ArrayOfTuples<T>::append(const Array<T>& x)
00129     {
00130       for (int i=0; i<x.length(); i++)
00131         {
00132           data_.append(x[i]);
00133         }
00134       numTuples_++;
00135     }
00136 
00137   template<class T> inline void ArrayOfTuples<T>::append(const T* x, int n)
00138     {
00139       for (int i=0; i<n; i++)
00140         {
00141           data_.append(x[i]);
00142         }
00143       numTuples_++;
00144     }
00145 
00146 
00147 }
00148 
00149 #endif

Site Contact