aboutsummaryrefslogtreecommitdiff
path: root/paludis/util/hashes.hh
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2008-04-26 13:59:04 +0000
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2008-04-26 13:59:04 +0000
commit118de550d2dc5508ff4446bdf7f2ddf7b497b9ba (patch)
tree5ced2de062474cb8e6537e68d71cbc7c5a80e802 /paludis/util/hashes.hh
parentf76a3a0a7b38b5a3652a9e9bcb13942483f7c53a (diff)
downloadpaludis-118de550d2dc5508ff4446bdf7f2ddf7b497b9ba.tar.gz
paludis-118de550d2dc5508ff4446bdf7f2ddf7b497b9ba.tar.xz
paludis::tr1:: is dead. We no longer support compilers that don't do tr1 (that means you, gcc-3).
Diffstat (limited to 'paludis/util/hashes.hh')
-rw-r--r--paludis/util/hashes.hh124
1 files changed, 124 insertions, 0 deletions
diff --git a/paludis/util/hashes.hh b/paludis/util/hashes.hh
new file mode 100644
index 000000000..6b29fded0
--- /dev/null
+++ b/paludis/util/hashes.hh
@@ -0,0 +1,124 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2008 Ciaran McCreesh
+ *
+ * This file is part of the Paludis package manager. Paludis 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.
+ *
+ * Paludis 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
+ */
+
+#ifndef PALUDIS_GUARD_PALUDIS_UTIL_HASHES_HH
+#define PALUDIS_GUARD_PALUDIS_UTIL_HASHES_HH 1
+
+#include <paludis/util/attributes.hh>
+#include <paludis/util/validated-fwd.hh>
+#include <cstddef>
+#include <utility>
+#include <tr1/type_traits>
+#include <tr1/memory>
+
+namespace paludis
+{
+ namespace hash_internals
+ {
+ template <typename T_, bool is_numeric_>
+ struct DefaultHash
+ {
+ static std::size_t hash(const T_ & t)
+ {
+ return static_cast<std::size_t>(t);
+ }
+ };
+
+ template <typename T_>
+ struct DefaultHash<T_, false>
+ {
+ static std::size_t hash(const T_ & t)
+ {
+ return t.hash();
+ }
+ };
+ }
+
+ template <typename T_>
+ class Hash
+ {
+ public:
+ std::size_t operator() (const T_ & t) const
+ {
+ return hash_internals::DefaultHash<T_, std::tr1::is_integral<T_>::value>::hash(t);
+ }
+ };
+
+ template <>
+ struct PALUDIS_VISIBLE Hash<std::string>
+ {
+ std::size_t operator() (const std::string &) const PALUDIS_ATTRIBUTE((warn_unused_result));
+ };
+
+ template <typename T_, typename U_>
+ struct Hash<std::pair<T_, U_> >
+ {
+ std::size_t operator() (const std::pair<T_, U_> & p) const
+ {
+ return Hash<T_>()(p.first) ^ Hash<U_>()(p.second);
+ }
+ };
+
+ template <typename D_, typename V_, bool b_, typename C_>
+ struct Hash<Validated<D_, V_, b_, C_> >
+ {
+ std::size_t operator() (const Validated<D_, V_, b_, C_> & v) const
+ {
+ return Hash<D_>()(v.data());
+ }
+ };
+
+ template <typename T_>
+ struct Hash<const T_>
+ {
+ std::size_t operator() (const T_ & t) const
+ {
+ return Hash<T_>()(t);
+ }
+ };
+
+ template <typename T_>
+ struct Hash<T_ &>
+ {
+ std::size_t operator() (const T_ & t) const
+ {
+ return Hash<T_>()(t);
+ }
+ };
+
+ template <typename T_>
+ struct Hash<T_ *>
+ {
+ std::size_t operator() (const T_ * const t) const
+ {
+ return Hash<T_>(*t);
+ }
+ };
+
+ template <typename T_>
+ struct Hash<std::tr1::shared_ptr<T_> >
+ {
+ std::size_t operator() (const std::tr1::shared_ptr<const T_> & t) const
+ {
+ return Hash<T_>()(*t);
+ }
+ };
+}
+
+#endif