vn-verdnaturachat/ios/Pods/boost-for-react-native/boost/hana/fwd/concept/hashable.hpp

69 lines
2.6 KiB
C++

/*!
@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