summaryrefslogtreecommitdiff
path: root/boost/hana/fwd/concept/hashable.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/fwd/concept/hashable.hpp')
-rw-r--r--boost/hana/fwd/concept/hashable.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/boost/hana/fwd/concept/hashable.hpp b/boost/hana/fwd/concept/hashable.hpp
new file mode 100644
index 0000000000..2fc4977ba9
--- /dev/null
+++ b/boost/hana/fwd/concept/hashable.hpp
@@ -0,0 +1,68 @@
+/*!
+@file
+Forward declares `boost::hana::Hashable`.
+
+@copyright Louis Dionne 2016
+@copyright Jason Rice 2016
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_HANA_FWD_CONCEPT_HASHABLE_HPP
+#define BOOST_HANA_FWD_CONCEPT_HASHABLE_HPP
+
+#include <boost/hana/config.hpp>
+
+
+BOOST_HANA_NAMESPACE_BEGIN
+ //! @ingroup group-concepts
+ //! @defgroup group-Hashable Hashable
+ //! The `Hashable` concept represents objects that can be normalized to
+ //! a type-level hash.
+ //!
+ //! In day to day programming, hashes are very important as a way to
+ //! efficiently lookup objects in maps. While the implementation of
+ //! maps is very different, the same idea of using hashes for efficient
+ //! lookup applies in metaprogramming. The `Hashable` concept represents
+ //! objects that can be summarized (possibly with loss of information) to
+ //! a type, in a way suitable for use in hash-based data structures. Of
+ //! course, in order for a hash to be well-behaved, it must obey some laws
+ //! that are explained below.
+ //!
+ //!
+ //! Minimal complete definition
+ //! ---------------------------
+ //! `hash`, satisfying the laws below
+ //!
+ //!
+ //! Laws
+ //! ----
+ //! First, `hana::hash` must return a `hana::type`. Furthermore, for any
+ //! two `Hashable` objects `x` and `y`, it must be the case that
+ //! @code
+ //! x == y implies hash(x) == hash(y)
+ //! @endcode
+ //!
+ //! where `==` denotes `hana::equal`. In other words, any two objects that
+ //! compare equal (with `hana::equal`) must also have the same hash.
+ //! However, the reverse is not true, and two different objects may have
+ //! the same hash. This situation of two different objects having the same
+ //! hash is called a _collision_.
+ //!
+ //!
+ //! Concrete models
+ //! ---------------
+ //! `hana::integral_constant`, `hana::type`, `hana::string`
+ //!
+ //!
+ //! Free model for `IntegralConstant`s
+ //! ----------------------------------
+ //! Any `IntegralConstant` is `Hashable`, by normalizing its value to a
+ //! `hana::integral_constant`. The type of the value held in the normalized
+ //! `integral_constant` is `unsigned long long` for unsigned integral
+ //! types, and `signed long long` for signed integral types.
+ template <typename T>
+ struct Hashable;
+BOOST_HANA_NAMESPACE_END
+
+#endif // !BOOST_HANA_FWD_CONCEPT_HASHABLE_HPP