summaryrefslogtreecommitdiff
path: root/boost/hana/fwd/tuple.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/fwd/tuple.hpp')
-rw-r--r--boost/hana/fwd/tuple.hpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/boost/hana/fwd/tuple.hpp b/boost/hana/fwd/tuple.hpp
new file mode 100644
index 0000000000..1624b3d296
--- /dev/null
+++ b/boost/hana/fwd/tuple.hpp
@@ -0,0 +1,224 @@
+/*!
+@file
+Forward declares `boost::hana::tuple`.
+
+@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_TUPLE_HPP
+#define BOOST_HANA_FWD_TUPLE_HPP
+
+#include <boost/hana/config.hpp>
+#include <boost/hana/fwd/core/make.hpp>
+#include <boost/hana/fwd/core/to.hpp>
+#include <boost/hana/fwd/integral_constant.hpp>
+#include <boost/hana/fwd/type.hpp>
+
+
+BOOST_HANA_NAMESPACE_BEGIN
+ //! @ingroup group-datatypes
+ //! General purpose index-based heterogeneous sequence with a fixed length.
+ //!
+ //! The tuple is the bread and butter for static metaprogramming.
+ //! Conceptually, it is like a `std::tuple`; it is a container able
+ //! of holding objects of different types and whose size is fixed at
+ //! compile-time. However, Hana's tuple provides much more functionality
+ //! than its `std` counterpart, and it is also much more efficient than
+ //! all standard library implementations tested so far.
+ //!
+ //! Tuples are index-based sequences. If you need an associative
+ //! sequence with a key-based access, then you should consider
+ //! `hana::map` or `hana::set` instead.
+ //!
+ //!
+ //! Modeled concepts
+ //! ----------------
+ //! `Sequence`, and all the concepts it refines
+ //!
+ //!
+ //! Provided operators
+ //! ------------------
+ //! For convenience, the following operators are provided:
+ //! @code
+ //! xs == ys -> equal(xs, ys)
+ //! xs != ys -> not_equal(xs, ys)
+ //!
+ //! xs < ys -> less(xs, ys)
+ //! xs <= ys -> less_equal(xs, ys)
+ //! xs > ys -> greater(xs, ys)
+ //! xs >= ys -> greater_equal(xs, ys)
+ //!
+ //! xs | f -> chain(xs, f)
+ //!
+ //! xs[n] -> at(xs, n)
+ //! @endcode
+ //!
+ //!
+ //! Example
+ //! -------
+ //! @include example/tuple/tuple.cpp
+#ifdef BOOST_HANA_DOXYGEN_INVOKED
+ template <typename ...Xn>
+ struct tuple {
+ //! Default constructs the `tuple`. Only exists when all the elements
+ //! of the tuple are default constructible.
+ constexpr tuple();
+
+ //! Initialize each element of the tuple with the corresponding element
+ //! from `xn...`. Only exists when all the elements of the tuple are
+ //! copy-constructible.
+ //!
+ //! @note
+ //! Unlike the corresponding constructor for `std::tuple`, this
+ //! constructor is not explicit. This allows returning a tuple
+ //! from a function with the brace-initialization syntax.
+ constexpr tuple(Xn const& ...xn);
+
+ //! Initialize each element of the tuple by perfect-forwarding the
+ //! corresponding element in `yn...`. Only exists when all the
+ //! elements of the created tuple are constructible from the
+ //! corresponding perfect-forwarded value.
+ //!
+ //! @note
+ //! Unlike the corresponding constructor for `std::tuple`, this
+ //! constructor is not explicit. This allows returning a tuple
+ //! from a function with the brace-initialization syntax.
+ template <typename ...Yn>
+ constexpr tuple(Yn&& ...yn);
+
+ //! Copy-initialize a tuple from another tuple. Only exists when all
+ //! the elements of the constructed tuple are copy-constructible from
+ //! the corresponding element in the source tuple.
+ template <typename ...Yn>
+ constexpr tuple(tuple<Yn...> const& other);
+
+ //! Move-initialize a tuple from another tuple. Only exists when all
+ //! the elements of the constructed tuple are move-constructible from
+ //! the corresponding element in the source tuple.
+ template <typename ...Yn>
+ constexpr tuple(tuple<Yn...>&& other);
+
+ //! Assign a tuple to another tuple. Only exists when all the elements
+ //! of the destination tuple are assignable from the corresponding
+ //! element in the source tuple.
+ template <typename ...Yn>
+ constexpr tuple& operator=(tuple<Yn...> const& other);
+
+ //! Move-assign a tuple to another tuple. Only exists when all the
+ //! elements of the destination tuple are move-assignable from the
+ //! corresponding element in the source tuple.
+ template <typename ...Yn>
+ constexpr tuple& operator=(tuple<Yn...>&& other);
+
+ //! Equivalent to `hana::chain`.
+ template <typename ...T, typename F>
+ friend constexpr auto operator|(tuple<T...>, F);
+
+ //! Equivalent to `hana::equal`
+ template <typename X, typename Y>
+ friend constexpr auto operator==(X&& x, Y&& y);
+
+ //! Equivalent to `hana::not_equal`
+ template <typename X, typename Y>
+ friend constexpr auto operator!=(X&& x, Y&& y);
+
+ //! Equivalent to `hana::less`
+ template <typename X, typename Y>
+ friend constexpr auto operator<(X&& x, Y&& y);
+
+ //! Equivalent to `hana::greater`
+ template <typename X, typename Y>
+ friend constexpr auto operator>(X&& x, Y&& y);
+
+ //! Equivalent to `hana::less_equal`
+ template <typename X, typename Y>
+ friend constexpr auto operator<=(X&& x, Y&& y);
+
+ //! Equivalent to `hana::greater_equal`
+ template <typename X, typename Y>
+ friend constexpr auto operator>=(X&& x, Y&& y);
+
+ //! Equivalent to `hana::at`
+ template <typename N>
+ constexpr decltype(auto) operator[](N&& n);
+ };
+#else
+ template <typename ...Xn>
+ struct tuple;
+#endif
+
+ //! Tag representing `hana::tuple`s.
+ //! @related tuple
+ struct tuple_tag { };
+
+#ifdef BOOST_HANA_DOXYGEN_INVOKED
+ //! Function object for creating a `tuple`.
+ //! @relates hana::tuple
+ //!
+ //! Given zero or more objects `xs...`, `make<tuple_tag>` returns a new tuple
+ //! containing those objects. The elements are held by value inside the
+ //! resulting tuple, and they are hence copied or moved in. This is
+ //! analogous to `std::make_tuple` for creating Hana tuples.
+ //!
+ //!
+ //! Example
+ //! -------
+ //! @include example/tuple/make.cpp
+ template <>
+ constexpr auto make<tuple_tag> = [](auto&& ...xs) {
+ return tuple<std::decay_t<decltype(xs)>...>{forwarded(xs)...};
+ };
+#endif
+
+ //! Alias to `make<tuple_tag>`; provided for convenience.
+ //! @relates hana::tuple
+ constexpr auto make_tuple = make<tuple_tag>;
+
+ //! Equivalent to `to<tuple_tag>`; provided for convenience.
+ //! @relates hana::tuple
+ constexpr auto to_tuple = to<tuple_tag>;
+
+ //! Create a tuple specialized for holding `hana::type`s.
+ //! @relates hana::tuple
+ //!
+ //! This is functionally equivalent to `make<tuple_tag>(type_c<T>...)`, except
+ //! that using `tuple_t` allows the library to perform some compile-time
+ //! optimizations. Also note that the type of the objects returned by
+ //! `tuple_t` and an equivalent call to `make<tuple_tag>` may differ.
+ //!
+ //!
+ //! Example
+ //! -------
+ //! @include example/tuple/tuple_t.cpp
+#ifdef BOOST_HANA_DOXYGEN_INVOKED
+ template <typename ...T>
+ constexpr implementation_defined tuple_t{};
+#else
+ template <typename ...T>
+ constexpr hana::tuple<hana::type<T>...> tuple_t{};
+#endif
+
+ //! Create a tuple specialized for holding `hana::integral_constant`s.
+ //! @relates hana::tuple
+ //!
+ //! This is functionally equivalent to `make<tuple_tag>(integral_c<T, v>...)`,
+ //! except that using `tuple_c` allows the library to perform some
+ //! compile-time optimizations. Also note that the type of the objects
+ //! returned by `tuple_c` and an equivalent call to `make<tuple_tag>` may differ.
+ //!
+ //!
+ //! Example
+ //! -------
+ //! @include example/tuple/tuple_c.cpp
+#ifdef BOOST_HANA_DOXYGEN_INVOKED
+ template <typename T, T ...v>
+ constexpr implementation_defined tuple_c{};
+#else
+ template <typename T, T ...v>
+ constexpr hana::tuple<hana::integral_constant<T, v>...> tuple_c{};
+#endif
+BOOST_HANA_NAMESPACE_END
+
+#endif // !BOOST_HANA_FWD_TUPLE_HPP