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

104 lines
3.9 KiB
C++

/*!
@file
Forward declares `boost::hana::group`.
@copyright Louis Dionne 2013-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_GROUP_HPP
#define BOOST_HANA_FWD_GROUP_HPP
#include <boost/hana/config.hpp>
#include <boost/hana/core/when.hpp>
#include <boost/hana/detail/nested_by_fwd.hpp>
BOOST_HANA_NAMESPACE_BEGIN
//! Group adjacent elements of a sequence that all respect a binary
//! predicate, by default equality.
//! @ingroup group-Sequence
//!
//! Given a _finite_ Sequence and an optional predicate (by default
//! `equal`), `group` returns a sequence of subsequences representing
//! groups of adjacent elements that are "equal" with respect to the
//! predicate. In other words, the groups are such that the predicate is
//! satisfied when it is applied to any two adjacent elements in that
//! group. The sequence returned by `group` is such that the concatenation
//! of its elements is equal to the original sequence, which is equivalent
//! to saying that the order of the elements is not changed.
//!
//! If no predicate is provided, adjacent elements in the sequence must
//! all be compile-time `Comparable`.
//!
//!
//! Signature
//! ---------
//! Given a Sequence `s` with tag `S(T)`, an `IntegralConstant` `Bool`
//! holding a value of type `bool`, and a predicate
//! \f$ pred : T \times T \to Bool \f$, `group` has the following
//! signatures. For the variant with a provided predicate,
//! \f[
//! \mathtt{group} : S(T) \times (T \times T \to Bool) \to S(S(T))
//! \f]
//!
//! for the variant without a custom predicate, `T` is required to be
//! Comparable. The signature is then
//! \f[
//! \mathtt{group} : S(T) \to S(S(T))
//! \f]
//!
//! @param xs
//! The sequence to split into groups.
//!
//! @param predicate
//! A binary function called as `predicate(x, y)`, where `x` and `y` are
//! _adjacent_ elements in the sequence, whether both elements should be
//! in the same group (subsequence) of the result. In the current version
//! of the library, the result returned by `predicate` must be an
//! `IntegralConstant` holding a value of a type convertible to `bool`.
//! Also, `predicate` has to define an equivalence relation as defined by
//! the `Comparable` concept. When this predicate is not provided, it
//! defaults to `equal`, which requires the comparison of any two adjacent
//! elements in the sequence to return a boolean `IntegralConstant`.
//!
//!
//! Syntactic sugar (`group.by`)
//! ----------------------------
//! `group` can be called in a third way, which provides a nice syntax
//! especially when working with the `comparing` combinator:
//! @code
//! group.by(predicate, xs) == group(xs, predicate)
//! group.by(predicate) == group(-, predicate)
//! @endcode
//!
//! where `group(-, predicate)` denotes the partial application of
//! `group` to `predicate`.
//!
//!
//! Example
//! -------
//! @include example/group.cpp
#ifdef BOOST_HANA_DOXYGEN_INVOKED
constexpr auto group = [](auto&& xs[, auto&& predicate]) {
return tag-dispatched;
};
#else
template <typename S, typename = void>
struct group_impl : group_impl<S, when<true>> { };
struct group_t : detail::nested_by<group_t> {
template <typename Xs>
constexpr auto operator()(Xs&& xs) const;
template <typename Xs, typename Predicate>
constexpr auto operator()(Xs&& xs, Predicate&& pred) const;
};
constexpr group_t group{};
#endif
BOOST_HANA_NAMESPACE_END
#endif // !BOOST_HANA_FWD_GROUP_HPP