--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/model/hash-function.h Tue Nov 13 16:38:48 2012 -0800
@@ -0,0 +1,138 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 Lawrence Livermore National Laboratory
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Peter D. Barnes, Jr. <pdbarnes@llnl.gov>
+ */
+
+#ifndef HASHFUNCTION_H
+#define HASHFUNCTION_H
+
+#include "simple-ref-count.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup hash
+ *
+ * Hash value opaque types
+ */
+typedef uint32_t Hash32_t;
+typedef uint64_t Hash64_t;
+
+ namespace Hash {
+
+/**
+ * \ingroup hash
+ *
+ * \brief Hash function implementation base class
+ */
+class Implementation : public SimpleRefCount<Implementation>
+{
+public:
+ /**
+ * Compute 32-bit hash of a byte buffer
+ *
+ * \param [in] buffer pointer to the beginning of the buffer
+ * \param [in] size length of the buffer, in bytes
+ * \return 32-bit hash of the buffer
+ */
+ virtual Hash32_t GetHash32 (const char * buffer, const size_t size) = 0;
+ /**
+ * Compute 64-bit hash of a byte buffer.
+ *
+ * Default implementation returns 32-bit hash, with a warning.
+ *
+ * \param [in] buffer pointer to the beginning of the buffer
+ * \param [in] size length of the buffer, in bytes
+ * \return 64-bit hash of the buffer
+ */
+ virtual Hash64_t GetHash64 (const char * buffer, const size_t size);
+ /**
+ * Restore initial state
+ */
+ virtual void clear (void) = 0;
+ /**
+ * Constructor
+ */
+ Implementation () {} ;
+ /**
+ * Destructor
+ */
+ virtual ~Implementation () {} ;
+}; // Hashfunction
+
+
+/*--------------------------------------
+ * Hash function implementation
+ * by function pointers and templates
+ */
+
+/**
+ *
+ * \ingroup hash
+ *
+ * \brief Basic hash function typedefs.
+ *
+ * See Hash32Implementation<> or Hash64Implementation<>
+ */
+typedef Hash32_t (*Hash32Function_ptr) (const char *, const size_t);
+typedef Hash64_t (*Hash64Function_ptr) (const char *, const size_t);
+
+ namespace Function {
+
+/**
+ * \ingroup hash
+ *
+ * \brief Template for Hashfunctions from 32-bit hash functions
+ */
+template <Hash32Function_ptr hp>
+class Hash32 : public Implementation
+{
+ Hash32_t GetHash32 (const char * buffer, const size_t size)
+ {
+ return (*hp) (buffer, size);
+ }
+}; // Hash32<Hash32Function_ptr>
+
+/**
+ * \ingroup hash
+ *
+ * \brief Template for Hashfunctions from 64-bit hash functions
+ */
+template <Hash64Function_ptr hp>
+class Hash64 : public Implementation
+{
+ Hash64_t GetHash64 (const char * buffer, const size_t size)
+ {
+ return (*hp) (buffer, size);
+ }
+ Hash32_t GetHash32 (const char * buffer, const size_t size)
+ {
+ Hash64_t hash = GetHash64(buffer, size);
+ return (Hash32_t *)(&hash);
+ }
+}; // Hash64<Hash64Function_ptr>
+
+
+ } // namespace Function
+
+ } // namespace Hash
+
+} // namespace ns3
+
+#endif /* HASHFUNCTION_H */
+