| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | /*!@fileForward declares `boost::hana::group`.@copyright Louis Dionne 2013-2017Distributed 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{};#endifBOOST_HANA_NAMESPACE_END#endif // !BOOST_HANA_FWD_GROUP_HPP
 |