00001 /* @HEADER@ */ 00002 // ************************************************************************ 00003 // 00004 // Sundance 00005 // Copyright (2005) Sandia Corporation 00006 // 00007 // Copyright (year first published) Sandia Corporation. Under the terms 00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00009 // retains certain rights in this software. 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 Kevin Long (krlong@sandia.gov), 00026 // Sandia National Laboratories, Livermore, California, USA 00027 // 00028 // ************************************************************************ 00029 /* @HEADER@ */ 00030 00031 #ifndef SUNDANCE_BASICVERTEXVIEW_H 00032 #define SUNDANCE_BASICVERTEXVIEW_H 00033 00034 #include "SundanceDefs.hpp" 00035 #include "Teuchos_Array.hpp" 00036 00037 namespace Sundance 00038 { 00039 using namespace Teuchos; 00040 00041 /** 00042 * VertexView is a read-only "view" of a cell's vertices, where the 00043 * vertices are stored contiguously in a large master array. By working 00044 * with views, we can greatly reduce the number of temporary arrays 00045 * created during hashtable searches for existing vertex arrays. 00046 */ 00047 class VertexView 00048 { 00049 public: 00050 /** empty ctor, needed for storing VertexViews in Teuchos hashtables */ 00051 VertexView() : base_(0), offset_(0), length_(0) {;} 00052 /** Construct a view into an array 00053 * \param bese pointer to the start of the master data array. By 00054 * using double indirection, the master array can be resized or 00055 * relocated and VertexViews can remain valid. 00056 * \param offset the index of the vertex subarray being viewed. 00057 * \param length the number of vertices included in this view. 00058 */ 00059 VertexView(int** base, int offset, int length) 00060 : base_(base), offset_(offset), length_(length) {;} 00061 00062 /** 00063 * Return a hash code for the vertex set. 00064 */ 00065 int hashCode() const ; 00066 00067 /** 00068 * Test equality between two vertex sets. 00069 * Two vertex sets are equal when their vertices are identical. 00070 */ 00071 bool operator==(const VertexView& other) const ; 00072 00073 /** 00074 * Write to a std::string 00075 */ 00076 std::string toString() const ; 00077 00078 00079 private: 00080 int** base_; 00081 int offset_; 00082 int length_; 00083 }; 00084 00085 /* 00086 * Two vertex sets are equal when their vertices are identical. 00087 * 00088 */ 00089 inline bool VertexView::operator==(const VertexView& other) const 00090 { 00091 /* For efficiency's sake, skip the test for equal lengths because we 00092 * can assume the caller is only comparing equal length vertex views */ 00093 int* p = *base_ + offset_*length_; 00094 int* op = *(other.base_) + other.offset_*length_; 00095 00096 for (int i=0; i<length_; i++) 00097 { 00098 if (p[i] != op[i]) return false; 00099 } 00100 return true; 00101 } 00102 00103 00104 } 00105 00106 namespace Teuchos 00107 { 00108 /** \relates VertexView */ 00109 inline int hashCode(const Sundance::VertexView& v) 00110 {return v.hashCode();} 00111 00112 /** \relates VertexView */ 00113 inline std::string toString(const Sundance::VertexView& v) 00114 {return v.toString();} 00115 } 00116 00117 #endif