Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Tpetra_HashTable_decl.hpp
1 /*
2 // @HEADER
3 // ***********************************************************************
4 //
5 // Tpetra: Templated Linear Algebra Services Package
6 // Copyright (2008) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39 //
40 // ************************************************************************
41 // @HEADER
42 */
43 
44 #ifndef TPETRA_HASHTABLE_DECL_HPP
45 #define TPETRA_HASHTABLE_DECL_HPP
46 
47 #include <Teuchos_Describable.hpp>
48 #include "Tpetra_ConfigDefs.hpp"
49 
50 namespace Tpetra {
51 namespace Details {
52 
65 template<typename KeyType, typename ValueType>
66 class HashTable : public Teuchos::Describable {
68  struct Node {
69  KeyType Key;
70  ValueType Value;
71  Node * Ptr;
72 
73  Node (const KeyType key = 0, const ValueType value = 0, Node * ptr = NULL)
74  : Key(key), Value(value), Ptr(ptr) {}
75 
76  private:
77  Node (const Node& src) : Key(src.Key), Value(src.Value), Ptr(src.Ptr) {}
78 
79  Node& operator= (const Node& src) {
80  // We may safely omit the usual check for this == &src.
81  Key = src.Key;
82  Value = src.Value;
83  Ptr = src.Ptr;
84  return *this;
85  }
86  };
87 
88  Node ** Container_;
89  KeyType Size_;
90  unsigned int Seed_;
91 #ifdef HAVE_TPETRA_DEBUG
92  int maxc_; // Max size of the list among all entries w/ collisions. debug only.
93  int nc_; // Number of entries with collisions; use only in debug mode.
94 #endif // HAVE_TPETRA_DEBUG
95 
98  int hashFunc( const KeyType key );
99 
100  int getRecommendedSize( const int size );
101 
102 public:
109  HashTable (const int size, const unsigned int seed = (2654435761U));
110 
111  HashTable (const HashTable& obj);
112  ~HashTable();
113 
115  void add (const KeyType key, const ValueType value);
116 
118  ValueType get (const KeyType key);
119 
121 
122  std::string description() const;
124 
126  void
127  describe (Teuchos::FancyOStream &out,
128  const Teuchos::EVerbosityLevel verbLevel=
129  Teuchos::Describable::verbLevel_default) const;
131 
132 private:
135  operator= (const HashTable<KeyType,ValueType>& source);
136 };
137 
138 } // Details namespace
139 
140 } // Tpetra namespace
141 
142 #endif
HashTable(const int size, const unsigned int seed=(2654435761U))
void add(const KeyType key, const ValueType value)
Add a key and its value to the hash table.
std::string description() const
Implementation of Teuchos::Describable.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print this object with the given verbosity to the output stream.