• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*!
2 @file
3 Forward declares `boost::hana::front`.
4 
5 @copyright Louis Dionne 2013-2017
6 Distributed under the Boost Software License, Version 1.0.
7 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
8  */
9 
10 #ifndef BOOST_HANA_FWD_FRONT_HPP
11 #define BOOST_HANA_FWD_FRONT_HPP
12 
13 #include <boost/hana/config.hpp>
14 #include <boost/hana/core/when.hpp>
15 
16 
17 BOOST_HANA_NAMESPACE_BEGIN
18     //! Returns the first element of a non-empty iterable.
19     //! @ingroup group-Iterable
20     //!
21     //! Given a non-empty Iterable `xs` with a linearization of `[x1, ..., xN]`,
22     //! `front(xs)` is equal to `x1`. If `xs` is empty, it is an error to
23     //! use this function. Equivalently, `front(xs)` must be equivalent to
24     //! `at_c<0>(xs)`, and that regardless of the value category of `xs`
25     //! (`front` must respect the reference semantics of `at`).
26     //!
27     //!
28     //! Example
29     //! -------
30     //! @include example/front.cpp
31 #ifdef BOOST_HANA_DOXYGEN_INVOKED
32     constexpr auto front = [](auto&& xs) -> decltype(auto) {
33         return tag-dispatched;
34     };
35 #else
36     template <typename It, typename = void>
37     struct front_impl : front_impl<It, when<true>> { };
38 
39     struct front_t {
40         template <typename Xs>
41         constexpr decltype(auto) operator()(Xs&& xs) const;
42     };
43 
44     constexpr front_t front{};
45 #endif
46 BOOST_HANA_NAMESPACE_END
47 
48 #endif // !BOOST_HANA_FWD_FRONT_HPP
49