summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/test/ext/std
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/hana/test/ext/std
parentInitial commit. (diff)
downloadceph-19fcec84d8d7d21e796c7624e521b60d28ee21ed.tar.xz
ceph-19fcec84d8d7d21e796c7624e521b60d28ee21ed.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/hana/test/ext/std')
-rw-r--r--src/boost/libs/hana/test/ext/std/array/at.cpp43
-rw-r--r--src/boost/libs/hana/test/ext/std/array/comparable.cpp29
-rw-r--r--src/boost/libs/hana/test/ext/std/array/foldable.cpp29
-rw-r--r--src/boost/libs/hana/test/ext/std/array/issue_304.cpp21
-rw-r--r--src/boost/libs/hana/test/ext/std/array/iterable.cpp83
-rw-r--r--src/boost/libs/hana/test/ext/std/array/orderable.cpp29
-rw-r--r--src/boost/libs/hana/test/ext/std/array/searchable.cpp31
-rw-r--r--src/boost/libs/hana/test/ext/std/bugs/libcxx_19616.cpp21
-rw-r--r--src/boost/libs/hana/test/ext/std/bugs/libcxx_22806.cpp21
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/drop_front_exactly.cpp44
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/equal.cpp52
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/find_if.cpp101
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/front.cpp31
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/is_empty.cpp18
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/laws.cpp37
-rw-r--r--src/boost/libs/hana/test/ext/std/integer_sequence/unpack.cpp47
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/arithmetic.cpp31
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/comparable.cpp27
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/constant.cpp33
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/interop.cpp22
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/logical.cpp63
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/orderable.cpp25
-rw-r--r--src/boost/libs/hana/test/ext/std/integral_constant/tag.cpp53
-rw-r--r--src/boost/libs/hana/test/ext/std/pair/first_second.cpp30
-rw-r--r--src/boost/libs/hana/test/ext/std/pair/issue_90.cpp44
-rw-r--r--src/boost/libs/hana/test/ext/std/pair/laws.cpp41
-rw-r--r--src/boost/libs/hana/test/ext/std/pair/make.cpp26
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/div.cpp24
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/equal.cpp34
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/laws.cpp37
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/less.cpp29
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/minus.cpp19
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/mod.cpp24
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/mult.cpp19
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/one.cpp24
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/plus.cpp19
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/to.cpp36
-rw-r--r--src/boost/libs/hana/test/ext/std/ratio/zero.cpp24
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/_specs.hpp17
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/all_of.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/any_of.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/ap.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/at.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/cartesian_product.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/drop_back.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/drop_front.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/drop_while.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/for_each.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/group.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/index_if.cpp9
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/insert.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/insert_range.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/intersperse.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/is_empty.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/length.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/lexicographical_compare.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/make.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/none_of.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/partition.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/permutations.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/remove_at.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/remove_range.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/reverse.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/scans.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/sequence.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/slice.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/sort.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/span.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/take_back.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/take_front.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/take_while.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/transform.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/unfolds.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/unique.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/auto/zips.cpp8
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/issue_90.cpp73
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/laws.cpp43
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/laws.functor.cpp55
-rw-r--r--src/boost/libs/hana/test/ext/std/tuple/laws.searchable.cpp38
-rw-r--r--src/boost/libs/hana/test/ext/std/vector.cpp44
80 files changed, 1880 insertions, 0 deletions
diff --git a/src/boost/libs/hana/test/ext/std/array/at.cpp b/src/boost/libs/hana/test/ext/std/array/at.cpp
new file mode 100644
index 000000000..90ed1f5b7
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/at.cpp
@@ -0,0 +1,43 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/at.hpp>
+
+#include <laws/base.hpp> // for move_only
+
+#include <array>
+namespace hana = boost::hana;
+
+
+int main() {
+ // Check non-const lvalue reference
+ {
+ std::array<int, 2> arr = {{999, 888}};
+ int& i = hana::at_c<0>(arr);
+ BOOST_HANA_RUNTIME_CHECK(i == 999);
+ arr[0] = 333;
+ BOOST_HANA_RUNTIME_CHECK(i == 333);
+ i = 444;
+ BOOST_HANA_RUNTIME_CHECK(arr[0] == 444);
+ }
+
+ // Check const lvalue reference
+ {
+ std::array<int, 2> arr = {{999, 888}};
+ int const& i = hana::at_c<0>(static_cast<std::array<int, 2> const&>(arr));
+ BOOST_HANA_RUNTIME_CHECK(i == 999);
+ arr[0] = 333;
+ BOOST_HANA_RUNTIME_CHECK(i == 333);
+ }
+
+ // Check move-only types
+ {
+ std::array<hana::test::move_only, 2> arr{};
+ hana::test::move_only m = hana::at_c<0>(std::move(arr));
+ (void)m;
+ }
+}
diff --git a/src/boost/libs/hana/test/ext/std/array/comparable.cpp b/src/boost/libs/hana/test/ext/std/array/comparable.cpp
new file mode 100644
index 000000000..d0596fa6c
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/comparable.cpp
@@ -0,0 +1,29 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/comparable.hpp>
+
+#include <array>
+namespace hana = boost::hana;
+
+
+template <int ...i>
+constexpr auto array() { return std::array<int, sizeof...(i)>{{i...}}; }
+
+int main() {
+ auto int_arrays = hana::make_tuple(
+ array<>()
+ , array<0>()
+ , array<0, 1>()
+ , array<0, 1, 2>()
+ , array<0, 1, 2, 3>()
+ , array<0, 1, 2, 3, 4>()
+ );
+
+ hana::test::TestComparable<hana::ext::std::array_tag>{int_arrays};
+}
diff --git a/src/boost/libs/hana/test/ext/std/array/foldable.cpp b/src/boost/libs/hana/test/ext/std/array/foldable.cpp
new file mode 100644
index 000000000..b36e9521f
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/foldable.cpp
@@ -0,0 +1,29 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/foldable.hpp>
+
+#include <array>
+namespace hana = boost::hana;
+
+
+template <int ...i>
+constexpr auto array() { return std::array<int, sizeof...(i)>{{i...}}; }
+
+int main() {
+ auto int_arrays = hana::make_tuple(
+ array<>()
+ , array<0>()
+ , array<0, 1>()
+ , array<0, 1, 2>()
+ , array<0, 1, 2, 3>()
+ , array<0, 1, 2, 3, 4>()
+ );
+
+ hana::test::TestFoldable<hana::ext::std::array_tag>{int_arrays};
+}
diff --git a/src/boost/libs/hana/test/ext/std/array/issue_304.cpp b/src/boost/libs/hana/test/ext/std/array/issue_304.cpp
new file mode 100644
index 000000000..321f18f27
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/issue_304.cpp
@@ -0,0 +1,21 @@
+// 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)
+// modified from https://github.com/boostorg/hana/issues/304
+
+#include <boost/hana/ext/std/array.hpp>
+#include <boost/hana/tuple.hpp>
+
+namespace hana = boost::hana;
+
+struct Foo
+{
+ Foo() = default;
+ Foo(Foo const&) = delete;
+ Foo(Foo &&) = default;
+};
+
+using bar = decltype(hana::to_tuple(std::array<Foo, 2>()));
+
+int main()
+{ }
diff --git a/src/boost/libs/hana/test/ext/std/array/iterable.cpp b/src/boost/libs/hana/test/ext/std/array/iterable.cpp
new file mode 100644
index 000000000..38bd7731d
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/iterable.cpp
@@ -0,0 +1,83 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/drop_front_exactly.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/front.hpp>
+#include <boost/hana/integral_constant.hpp>
+#include <boost/hana/is_empty.hpp>
+#include <boost/hana/not.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/iterable.hpp>
+
+#include <array>
+namespace hana = boost::hana;
+
+
+template <int ...i>
+constexpr auto array() { return std::array<int, sizeof...(i)>{{i...}}; }
+
+int main() {
+ // is_empty
+ {
+ BOOST_HANA_CONSTANT_CHECK(hana::is_empty(array<>()));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(array<0>())));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(array<0, 1>())));
+ }
+
+ // front
+ {
+ BOOST_HANA_CONSTEXPR_CHECK(hana::front(array<0>()) == 0);
+ BOOST_HANA_CONSTEXPR_CHECK(hana::front(array<0, 1>()) == 0);
+ BOOST_HANA_CONSTEXPR_CHECK(hana::front(array<0, 1, 2>()) == 0);
+ }
+
+ // drop_front_exactly
+ {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0>()),
+ array<>()
+ ));
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0, 1>()),
+ array<1>()
+ ));
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0, 1, 2>()),
+ array<1, 2>()
+ ));
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0, 1, 2, 3>()),
+ array<1, 2, 3>()
+ ));
+
+
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0, 1, 2, 3>(), hana::size_c<2>),
+ array<2, 3>()
+ ));
+
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::drop_front_exactly(array<0, 1, 2, 3>(), hana::size_c<3>),
+ array<3>()
+ ));
+ }
+
+ // laws
+ auto int_arrays = hana::make_tuple(
+ array<>()
+ , array<0>()
+ , array<0, 1>()
+ , array<0, 1, 2>()
+ , array<0, 1, 2, 3>()
+ , array<0, 1, 2, 3, 4>()
+ );
+
+ hana::test::TestIterable<hana::ext::std::array_tag>{int_arrays};
+}
diff --git a/src/boost/libs/hana/test/ext/std/array/orderable.cpp b/src/boost/libs/hana/test/ext/std/array/orderable.cpp
new file mode 100644
index 000000000..ced9ab6b4
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/orderable.cpp
@@ -0,0 +1,29 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/orderable.hpp>
+
+#include <array>
+namespace hana = boost::hana;
+
+
+template <int ...i>
+constexpr auto array() { return std::array<int, sizeof...(i)>{{i...}}; }
+
+int main() {
+ auto int_arrays = hana::make_tuple(
+ array<>()
+ , array<0>()
+ , array<0, 1>()
+ , array<0, 1, 2>()
+ , array<0, 1, 2, 3>()
+ , array<0, 1, 2, 3, 4>()
+ );
+
+ hana::test::TestOrderable<hana::ext::std::array_tag>{int_arrays};
+}
diff --git a/src/boost/libs/hana/test/ext/std/array/searchable.cpp b/src/boost/libs/hana/test/ext/std/array/searchable.cpp
new file mode 100644
index 000000000..1ba584fde
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/array/searchable.cpp
@@ -0,0 +1,31 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/array.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/searchable.hpp>
+
+#include <array>
+namespace hana = boost::hana;
+
+
+template <int ...i>
+constexpr auto array() { return std::array<int, sizeof...(i)>{{i...}}; }
+
+int main() {
+ auto eq_arrays = hana::make_tuple(
+ std::array<hana::test::ct_eq<0>, 0>{}
+ , std::array<hana::test::ct_eq<0>, 1>{}
+ , std::array<hana::test::ct_eq<0>, 2>{}
+ , std::array<hana::test::ct_eq<0>, 3>{}
+ , std::array<hana::test::ct_eq<0>, 4>{}
+ );
+
+ auto eq_keys = hana::make_tuple(hana::test::ct_eq<0>{});
+
+ hana::test::TestSearchable<hana::ext::std::array_tag>{eq_arrays, eq_keys};
+}
diff --git a/src/boost/libs/hana/test/ext/std/bugs/libcxx_19616.cpp b/src/boost/libs/hana/test/ext/std/bugs/libcxx_19616.cpp
new file mode 100644
index 000000000..2b91f88ad
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/bugs/libcxx_19616.cpp
@@ -0,0 +1,21 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/lift.hpp>
+
+#include <tuple>
+namespace hana = boost::hana;
+
+
+int main() {
+ // Make sure we workaround the bug at:
+ // http://llvm.org/bugs/show_bug.cgi?id=19616
+ BOOST_HANA_CONSTEXPR_CHECK(hana::equal(
+ hana::lift<hana::ext::std::tuple_tag>(std::make_tuple(1)),
+ std::make_tuple(std::make_tuple(1))
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/bugs/libcxx_22806.cpp b/src/boost/libs/hana/test/ext/std/bugs/libcxx_22806.cpp
new file mode 100644
index 000000000..281481086
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/bugs/libcxx_22806.cpp
@@ -0,0 +1,21 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/chain.hpp>
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/functional/compose.hpp>
+#include <boost/hana/lift.hpp>
+
+#include <laws/base.hpp>
+
+#include <tuple>
+namespace hana = boost::hana;
+
+
+int main() {
+ using M = hana::ext::std::tuple_tag;
+ auto m = std::make_tuple(hana::test::ct_eq<0>{});
+ auto f = hana::compose(hana::lift<M>, hana::test::_injection<0>{});
+ hana::chain(m, hana::compose(hana::lift<M>, f));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/drop_front_exactly.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/drop_front_exactly.cpp
new file mode 100644
index 000000000..a9556ccb7
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/drop_front_exactly.cpp
@@ -0,0 +1,44 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/drop_front_exactly.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/integral_constant.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0>{}),
+ std::index_sequence<>{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0, 1>{}),
+ std::index_sequence<1>{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0, 1, 2>{}),
+ std::index_sequence<1, 2>{}
+ ));
+
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0, 1, 2>{}, hana::size_c<2>),
+ std::index_sequence<2>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0, 1, 2, 3>{}, hana::size_c<2>),
+ std::index_sequence<2, 3>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::drop_front_exactly(std::index_sequence<0, 1, 2, 3>{}, hana::size_c<3>),
+ std::index_sequence<3>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/equal.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/equal.cpp
new file mode 100644
index 000000000..7249d234d
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/equal.cpp
@@ -0,0 +1,52 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/not.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+
+
+using T = int;
+using U = long long;
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::integer_sequence<T>{},
+ std::integer_sequence<U>{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::integer_sequence<T, 0>{},
+ std::integer_sequence<U>{}
+ )));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::integer_sequence<T>{},
+ std::integer_sequence<U, 0>{}
+ )));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::integer_sequence<T, 0>{},
+ std::integer_sequence<U, 0>{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::integer_sequence<T, 0>{},
+ std::integer_sequence<U, 0, 1>{}
+ )));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::integer_sequence<T, 0, 2>{},
+ std::integer_sequence<U, 0, 1>{}
+ )));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::integer_sequence<T, 0, 1, 2, 3>{},
+ std::integer_sequence<U, 0, 1, 2, 3>{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::integer_sequence<T, 0, 1, 2, 3, 5>{},
+ std::integer_sequence<U, 0, 1, 2, 3>{}
+ )));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/find_if.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/find_if.cpp
new file mode 100644
index 000000000..4c904ed65
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/find_if.cpp
@@ -0,0 +1,101 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/ext/std/integral_constant.hpp>
+#include <boost/hana/find_if.hpp>
+#include <boost/hana/optional.hpp>
+
+#include <cstddef>
+#include <type_traits>
+#include <utility>
+namespace hana = boost::hana;
+
+
+struct undefined { };
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<>{},
+ hana::equal.to(undefined{})),
+ hana::nothing
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0>{},
+ hana::equal.to(std::integral_constant<std::size_t, 0>{})),
+ hana::just(std::integral_constant<std::size_t, 0>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0>{},
+ hana::equal.to(std::integral_constant<std::size_t, 1>{})),
+ hana::nothing
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1>{},
+ hana::equal.to(std::integral_constant<std::size_t, 0>{})),
+ hana::just(std::integral_constant<std::size_t, 0>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1>{},
+ hana::equal.to(std::integral_constant<std::size_t, 1>{})),
+ hana::just(std::integral_constant<std::size_t, 1>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1>{},
+ hana::equal.to(std::integral_constant<std::size_t, 2>{})),
+ hana::nothing
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2>{},
+ hana::equal.to(std::integral_constant<std::size_t, 0>{})),
+ hana::just(std::integral_constant<std::size_t, 0>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2>{},
+ hana::equal.to(std::integral_constant<std::size_t, 1>{})),
+ hana::just(std::integral_constant<std::size_t, 1>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2>{},
+ hana::equal.to(std::integral_constant<std::size_t, 2>{})),
+ hana::just(std::integral_constant<std::size_t, 2>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2>{},
+ hana::equal.to(std::integral_constant<std::size_t, 3>{})),
+ hana::nothing
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2, 3>{},
+ hana::equal.to(std::integral_constant<std::size_t, 0>{})),
+ hana::just(std::integral_constant<std::size_t, 0>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2, 3>{},
+ hana::equal.to(std::integral_constant<std::size_t, 1>{})),
+ hana::just(std::integral_constant<std::size_t, 1>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2, 3>{},
+ hana::equal.to(std::integral_constant<std::size_t, 2>{})),
+ hana::just(std::integral_constant<std::size_t, 2>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2, 3>{},
+ hana::equal.to(std::integral_constant<std::size_t, 3>{})),
+ hana::just(std::integral_constant<std::size_t, 3>{})
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::find_if(std::index_sequence<0, 1, 2, 3>{},
+ hana::equal.to(std::integral_constant<std::size_t, 4>{})),
+ hana::nothing
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/front.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/front.cpp
new file mode 100644
index 000000000..69372c99b
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/front.cpp
@@ -0,0 +1,31 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/ext/std/integral_constant.hpp>
+#include <boost/hana/front.hpp>
+
+#include <type_traits>
+#include <utility>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::front(std::index_sequence<0>{}),
+ std::integral_constant<std::size_t, 0>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::front(std::index_sequence<0, 1>{}),
+ std::integral_constant<std::size_t, 0>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::front(std::integer_sequence<int, -3, 1, 2, 3, 4>{}),
+ std::integral_constant<int, -3>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/is_empty.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/is_empty.cpp
new file mode 100644
index 000000000..b6c79c755
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/is_empty.cpp
@@ -0,0 +1,18 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/is_empty.hpp>
+#include <boost/hana/not.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::is_empty(std::index_sequence<>{}));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(std::index_sequence<0>{})));
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(std::index_sequence<1>{})));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/laws.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/laws.cpp
new file mode 100644
index 000000000..8cc7fcc43
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/laws.cpp
@@ -0,0 +1,37 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/ext/std/integral_constant.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/comparable.hpp>
+#include <laws/foldable.hpp>
+#include <laws/iterable.hpp>
+#include <laws/searchable.hpp>
+
+#include <type_traits>
+#include <utility>
+namespace hana = boost::hana;
+
+
+auto sequences = hana::make_tuple(
+ std::integer_sequence<int>{},
+ std::integer_sequence<int, 2>{},
+ std::integer_sequence<int, 3>{},
+ std::integer_sequence<int, 3, 4>{},
+ std::integer_sequence<int, 3, 4, 5>{}
+);
+
+auto keys = hana::make_tuple(
+ std::integral_constant<int, 3>{}, std::integral_constant<long long, 4>{}
+);
+
+int main() {
+ hana::test::TestComparable<hana::ext::std::integer_sequence_tag>{sequences};
+ hana::test::TestFoldable<hana::ext::std::integer_sequence_tag>{sequences};
+ hana::test::TestIterable<hana::ext::std::integer_sequence_tag>{sequences};
+ hana::test::TestSearchable<hana::ext::std::integer_sequence_tag>{sequences, keys};
+}
diff --git a/src/boost/libs/hana/test/ext/std/integer_sequence/unpack.cpp b/src/boost/libs/hana/test/ext/std/integer_sequence/unpack.cpp
new file mode 100644
index 000000000..5ef9320c8
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integer_sequence/unpack.cpp
@@ -0,0 +1,47 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/integer_sequence.hpp>
+#include <boost/hana/ext/std/integral_constant.hpp>
+#include <boost/hana/unpack.hpp>
+
+#include <laws/base.hpp>
+
+#include <type_traits>
+#include <utility>
+namespace hana = boost::hana;
+
+
+int main() {
+ hana::test::_injection<0> f{};
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::unpack(std::integer_sequence<int>{}, f),
+ f()
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::unpack(std::integer_sequence<int, 0>{}, f),
+ f(std::integral_constant<int, 0>{})
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::unpack(std::integer_sequence<int, 0, 1>{}, f),
+ f(std::integral_constant<int, 0>{}, std::integral_constant<int, 1>{})
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::unpack(std::integer_sequence<int, 0, 1, 2>{}, f),
+ f(std::integral_constant<int, 0>{}, std::integral_constant<int, 1>{},
+ std::integral_constant<int, 2>{})
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::unpack(std::integer_sequence<int, 0, 1, 2, 3>{}, f),
+ f(std::integral_constant<int, 0>{}, std::integral_constant<int, 1>{},
+ std::integral_constant<int, 2>{}, std::integral_constant<int, 3>{})
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/arithmetic.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/arithmetic.cpp
new file mode 100644
index 000000000..25372ddd5
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/arithmetic.cpp
@@ -0,0 +1,31 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/euclidean_ring.hpp>
+#include <laws/group.hpp>
+#include <laws/monoid.hpp>
+#include <laws/ring.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ auto ints = hana::make_tuple(
+ std::integral_constant<int, -10>{},
+ std::integral_constant<int, -2>{},
+ std::integral_constant<int, 0>{},
+ std::integral_constant<int, 1>{},
+ std::integral_constant<int, 3>{}
+ );
+
+ hana::test::TestMonoid<hana::ext::std::integral_constant_tag<int>>{ints};
+ hana::test::TestGroup<hana::ext::std::integral_constant_tag<int>>{ints};
+ hana::test::TestRing<hana::ext::std::integral_constant_tag<int>>{ints};
+ hana::test::TestEuclideanRing<hana::ext::std::integral_constant_tag<int>>{ints};
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/comparable.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/comparable.cpp
new file mode 100644
index 000000000..d17b6d810
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/comparable.cpp
@@ -0,0 +1,27 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/comparable.hpp>
+#include <laws/hashable.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ auto ints = hana::make_tuple(
+ std::integral_constant<int, -10>{},
+ std::integral_constant<int, -2>{},
+ std::integral_constant<int, 0>{},
+ std::integral_constant<int, 1>{},
+ std::integral_constant<int, 3>{}
+ );
+
+ hana::test::TestComparable<hana::ext::std::integral_constant_tag<int>>{ints};
+ hana::test::TestHashable<hana::ext::std::integral_constant_tag<void>>{ints};
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/constant.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/constant.cpp
new file mode 100644
index 000000000..f15fb8e80
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/constant.cpp
@@ -0,0 +1,33 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/tuple.hpp>
+#include <boost/hana/value.hpp>
+
+#include <laws/constant.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ // value
+ static_assert(hana::value(std::integral_constant<int, 0>{}) == 0, "");
+ static_assert(hana::value(std::integral_constant<int, 1>{}) == 1, "");
+ static_assert(hana::value(std::integral_constant<int, 3>{}) == 3, "");
+
+ // laws
+ hana::test::TestConstant<hana::ext::std::integral_constant_tag<int>>{
+ hana::make_tuple(
+ std::integral_constant<int, -10>{},
+ std::integral_constant<int, -2>{},
+ std::integral_constant<int, 0>{},
+ std::integral_constant<int, 1>{},
+ std::integral_constant<int, 3>{}
+ ),
+ hana::tuple_t<int, long, long long>
+ };
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/interop.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/interop.cpp
new file mode 100644
index 000000000..9b445f01b
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/interop.cpp
@@ -0,0 +1,22 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/integral_constant.hpp>
+#include <boost/hana/not_equal.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ // Interoperation with hana::integral_constant
+ BOOST_HANA_CONSTANT_CHECK(std::integral_constant<int, 1>{} == hana::int_c<1>);
+ BOOST_HANA_CONSTANT_CHECK(std::integral_constant<int, 1>{} == hana::long_c<1>);
+
+ BOOST_HANA_CONSTANT_CHECK(std::integral_constant<int, 2>{} != hana::int_c<3>);
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/logical.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/logical.cpp
new file mode 100644
index 000000000..38d8091c2
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/logical.cpp
@@ -0,0 +1,63 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/eval_if.hpp>
+#include <boost/hana/functional/always.hpp>
+#include <boost/hana/integral_constant.hpp>
+#include <boost/hana/not.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/logical.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ // eval_if
+ {
+ auto t = hana::test::ct_eq<3>{};
+ auto e = hana::test::ct_eq<4>{};
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::eval_if(std::true_type{}, hana::always(t), hana::always(e)),
+ t
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::eval_if(std::false_type{}, hana::always(t), hana::always(e)),
+ e
+ ));
+ }
+
+ // not_
+ {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::not_(std::true_type{}),
+ std::false_type{}
+ ));
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::not_(std::false_type{}),
+ std::true_type{}
+ ));
+ }
+
+ auto ints = hana::make_tuple(
+ std::integral_constant<int, -2>{},
+ std::integral_constant<int, 0>{},
+ std::integral_constant<int, 1>{},
+ std::integral_constant<int, 3>{}
+ );
+
+ auto bools = hana::make_tuple(std::true_type{}, std::false_type{});
+
+ // laws
+ hana::test::TestLogical<hana::ext::std::integral_constant_tag<int>>{ints};
+ hana::test::TestLogical<hana::ext::std::integral_constant_tag<bool>>{bools};
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/orderable.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/orderable.cpp
new file mode 100644
index 000000000..6a14ad147
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/orderable.cpp
@@ -0,0 +1,25 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/tuple.hpp>
+
+#include <laws/orderable.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+int main() {
+ auto ints = hana::make_tuple(
+ std::integral_constant<int, -10>{},
+ std::integral_constant<int, -2>{},
+ std::integral_constant<int, 0>{},
+ std::integral_constant<int, 1>{},
+ std::integral_constant<int, 3>{}
+ );
+
+ hana::test::TestOrderable<hana::ext::std::integral_constant_tag<int>>{ints};
+}
diff --git a/src/boost/libs/hana/test/ext/std/integral_constant/tag.cpp b/src/boost/libs/hana/test/ext/std/integral_constant/tag.cpp
new file mode 100644
index 000000000..8a747e441
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/integral_constant/tag.cpp
@@ -0,0 +1,53 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/integral_constant.hpp>
+
+#include <boost/hana/core/tag_of.hpp>
+
+#include <type_traits>
+namespace hana = boost::hana;
+
+
+struct inherit_simple : std::integral_constant<int, 3> { };
+struct inherit_no_default : std::integral_constant<int, 3> {
+ inherit_no_default() = delete;
+};
+
+struct incomplete;
+struct empty_type { };
+struct non_pod { virtual ~non_pod() { } };
+
+
+static_assert(std::is_same<
+ hana::tag_of_t<inherit_simple>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+static_assert(std::is_same<
+ hana::tag_of_t<inherit_no_default>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+static_assert(std::is_same<
+ hana::tag_of_t<std::is_pointer<int*>>,
+ hana::ext::std::integral_constant_tag<bool>
+>{}, "");
+
+static_assert(!std::is_same<
+ hana::tag_of_t<incomplete>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+static_assert(!std::is_same<
+ hana::tag_of_t<empty_type>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+static_assert(!std::is_same<
+ hana::tag_of_t<non_pod>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+static_assert(!std::is_same<
+ hana::tag_of_t<void>,
+ hana::ext::std::integral_constant_tag<int>
+>{}, "");
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/pair/first_second.cpp b/src/boost/libs/hana/test/ext/std/pair/first_second.cpp
new file mode 100644
index 000000000..a44ed1cc3
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/pair/first_second.cpp
@@ -0,0 +1,30 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/pair.hpp>
+#include <boost/hana/first.hpp>
+#include <boost/hana/second.hpp>
+
+#include <laws/base.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+
+
+int main() {
+ // first
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::first(std::make_pair(ct_eq<0>{}, ct_eq<1>{})),
+ ct_eq<0>{}
+ ));
+
+ // second
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::second(std::make_pair(ct_eq<0>{}, ct_eq<1>{})),
+ ct_eq<1>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/pair/issue_90.cpp b/src/boost/libs/hana/test/ext/std/pair/issue_90.cpp
new file mode 100644
index 000000000..d8f70c56e
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/pair/issue_90.cpp
@@ -0,0 +1,44 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/pair.hpp>
+#include <boost/hana/first.hpp>
+#include <boost/hana/second.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+
+
+template <typename T>
+T const& cref(T& t) { return t; }
+
+// a non-movable, non-copyable type
+template <int i>
+struct RefOnly {
+ RefOnly() = default;
+ RefOnly(RefOnly const&) = delete;
+ RefOnly(RefOnly&&) = delete;
+};
+
+int main() {
+ // This test makes sure that we return the proper reference types from
+ // `first` and `second`.
+ std::pair<RefOnly<0>, RefOnly<1>> p;
+
+ {
+ RefOnly<0>&& r1 = hana::first(std::move(p));
+ RefOnly<0>& r2 = hana::first(p);
+ RefOnly<0> const& r3 = hana::first(cref(p));
+
+ (void)r1; (void)r2; (void)r3;
+ }
+
+ {
+ RefOnly<1>&& r1 = hana::second(std::move(p));
+ RefOnly<1>& r2 = hana::second(p);
+ RefOnly<1> const& r3 = hana::second(cref(p));
+
+ (void)r1; (void)r2; (void)r3;
+ }
+}
diff --git a/src/boost/libs/hana/test/ext/std/pair/laws.cpp b/src/boost/libs/hana/test/ext/std/pair/laws.cpp
new file mode 100644
index 000000000..869001ab6
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/pair/laws.cpp
@@ -0,0 +1,41 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/pair.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/comparable.hpp>
+#include <laws/foldable.hpp>
+#include <laws/orderable.hpp>
+#include <laws/product.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+using hana::test::ct_ord;
+
+
+int main() {
+ auto eq_elems = hana::make_tuple(ct_eq<3>{}, ct_eq<4>{});
+
+ auto eqs = hana::make_tuple(
+ std::make_pair(ct_eq<3>{}, ct_eq<3>{})
+ , std::make_pair(ct_eq<3>{}, ct_eq<4>{})
+ , std::make_pair(ct_eq<4>{}, ct_eq<3>{})
+ , std::make_pair(ct_eq<4>{}, ct_eq<4>{})
+ );
+
+ auto ords = hana::make_tuple(
+ std::make_pair(ct_ord<3>{}, ct_ord<3>{})
+ , std::make_pair(ct_ord<3>{}, ct_ord<4>{})
+ , std::make_pair(ct_ord<4>{}, ct_ord<3>{})
+ , std::make_pair(ct_ord<4>{}, ct_ord<4>{})
+ );
+
+ hana::test::TestComparable<hana::ext::std::pair_tag>{eqs};
+ hana::test::TestOrderable<hana::ext::std::pair_tag>{ords};
+ hana::test::TestFoldable<hana::ext::std::pair_tag>{eqs};
+ hana::test::TestProduct<hana::ext::std::pair_tag>{eq_elems};
+}
diff --git a/src/boost/libs/hana/test/ext/std/pair/make.cpp b/src/boost/libs/hana/test/ext/std/pair/make.cpp
new file mode 100644
index 000000000..f0cb9d297
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/pair/make.cpp
@@ -0,0 +1,26 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/pair.hpp>
+
+#include <laws/base.hpp>
+
+#include <utility>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::make<hana::ext::std::pair_tag>(ct_eq<0>{}, ct_eq<1>{}),
+ std::make_pair(ct_eq<0>{}, ct_eq<1>{})
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::make<hana::ext::std::pair_tag>(ct_eq<3>{}, ct_eq<4>{}),
+ std::make_pair(ct_eq<3>{}, ct_eq<4>{})
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/div.cpp b/src/boost/libs/hana/test/ext/std/ratio/div.cpp
new file mode 100644
index 000000000..327717fcb
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/div.cpp
@@ -0,0 +1,24 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/div.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::div(std::ratio<6>{}, std::ratio<4>{}),
+ std::ratio<6, 4>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::div(std::ratio<3, 4>{}, std::ratio<5, 10>{}),
+ std::ratio<3*10, 4*5>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/equal.cpp b/src/boost/libs/hana/test/ext/std/ratio/equal.cpp
new file mode 100644
index 000000000..f72ec8980
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/equal.cpp
@@ -0,0 +1,34 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/not.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::ratio<0>{},
+ std::ratio<0>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::ratio<3>{},
+ std::ratio<3>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ std::ratio<3, 5>{},
+ std::ratio<6, 10>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::equal(
+ std::ratio<4, 5>{},
+ std::ratio<6, 10>{}
+ )));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/laws.cpp b/src/boost/libs/hana/test/ext/std/ratio/laws.cpp
new file mode 100644
index 000000000..460fe3c81
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/laws.cpp
@@ -0,0 +1,37 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/comparable.hpp>
+#include <laws/euclidean_ring.hpp>
+#include <laws/group.hpp>
+#include <laws/monoid.hpp>
+#include <laws/orderable.hpp>
+#include <laws/ring.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ auto ratios = hana::make_tuple(
+ std::ratio<0>{}
+ , std::ratio<1, 3>{}
+ , std::ratio<1, 2>{}
+ , std::ratio<2, 6>{}
+ , std::ratio<3, 1>{}
+ , std::ratio<7, 8>{}
+ , std::ratio<3, 5>{}
+ , std::ratio<2, 1>{}
+ );
+
+ hana::test::TestComparable<hana::ext::std::ratio_tag>{ratios};
+ hana::test::TestOrderable<hana::ext::std::ratio_tag>{ratios};
+ hana::test::TestMonoid<hana::ext::std::ratio_tag>{ratios};
+ hana::test::TestGroup<hana::ext::std::ratio_tag>{ratios};
+ hana::test::TestRing<hana::ext::std::ratio_tag>{ratios};
+ hana::test::TestEuclideanRing<hana::ext::std::ratio_tag>{ratios};
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/less.cpp b/src/boost/libs/hana/test/ext/std/ratio/less.cpp
new file mode 100644
index 000000000..79e8dbc42
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/less.cpp
@@ -0,0 +1,29 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/less.hpp>
+#include <boost/hana/not.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::less(
+ std::ratio<1>{},
+ std::ratio<3>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::less(
+ std::ratio<4, 10>{},
+ std::ratio<3, 5>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::less(
+ std::ratio<3, 5>{},
+ std::ratio<4, 10>{}
+ )));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/minus.cpp b/src/boost/libs/hana/test/ext/std/ratio/minus.cpp
new file mode 100644
index 000000000..9a6bc4199
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/minus.cpp
@@ -0,0 +1,19 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/minus.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::minus(std::ratio<3, 4>{}, std::ratio<5, 10>{}),
+ std::ratio<3*10 - 5*4, 4*10>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/mod.cpp b/src/boost/libs/hana/test/ext/std/ratio/mod.cpp
new file mode 100644
index 000000000..24c748eb3
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/mod.cpp
@@ -0,0 +1,24 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/mod.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::mod(std::ratio<6>{}, std::ratio<4>{}),
+ std::ratio<0>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::mod(std::ratio<3, 4>{}, std::ratio<5, 10>{}),
+ std::ratio<0>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/mult.cpp b/src/boost/libs/hana/test/ext/std/ratio/mult.cpp
new file mode 100644
index 000000000..5f345bf2f
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/mult.cpp
@@ -0,0 +1,19 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/mult.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::mult(std::ratio<3, 4>{}, std::ratio<5, 10>{}),
+ std::ratio<3*5, 4*10>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/one.cpp b/src/boost/libs/hana/test/ext/std/ratio/one.cpp
new file mode 100644
index 000000000..a05ac1be1
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/one.cpp
@@ -0,0 +1,24 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/one.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::one<hana::ext::std::ratio_tag>(),
+ std::ratio<1, 1>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::one<hana::ext::std::ratio_tag>(),
+ std::ratio<2, 2>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/plus.cpp b/src/boost/libs/hana/test/ext/std/ratio/plus.cpp
new file mode 100644
index 000000000..33a47bd9d
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/plus.cpp
@@ -0,0 +1,19 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/plus.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::plus(std::ratio<3, 4>{}, std::ratio<5, 10>{}),
+ std::ratio<3*10 + 5*4, 4*10>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/to.cpp b/src/boost/libs/hana/test/ext/std/ratio/to.cpp
new file mode 100644
index 000000000..2795c990a
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/to.cpp
@@ -0,0 +1,36 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/core/to.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+
+#include <laws/base.hpp>
+#include <support/cnumeric.hpp>
+
+#include <ratio>
+#include <utility>
+namespace hana = boost::hana;
+
+
+int main() {
+ // Conversion from a Constant to a std::ratio
+ {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::to<hana::ext::std::ratio_tag>(cnumeric<int, 0>),
+ std::ratio<0>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::to<hana::ext::std::ratio_tag>(cnumeric<int, 1>),
+ std::ratio<1>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::to<hana::ext::std::ratio_tag>(cnumeric<int, 3>),
+ std::ratio<3>{}
+ ));
+ }
+}
diff --git a/src/boost/libs/hana/test/ext/std/ratio/zero.cpp b/src/boost/libs/hana/test/ext/std/ratio/zero.cpp
new file mode 100644
index 000000000..af0fa1711
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/ratio/zero.cpp
@@ -0,0 +1,24 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/ratio.hpp>
+#include <boost/hana/zero.hpp>
+
+#include <ratio>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::zero<hana::ext::std::ratio_tag>(),
+ std::ratio<0, 1>{}
+ ));
+
+ BOOST_HANA_CONSTANT_CHECK(hana::equal(
+ hana::zero<hana::ext::std::ratio_tag>(),
+ std::ratio<0, 2>{}
+ ));
+}
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/_specs.hpp b/src/boost/libs/hana/test/ext/std/tuple/auto/_specs.hpp
new file mode 100644
index 000000000..c165d4214
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/_specs.hpp
@@ -0,0 +1,17 @@
+// Copyright Louis Dionne 2013-2017
+// 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_TEST_EXT_STD_TUPLE_AUTO_SPECS_HPP
+#define BOOST_HANA_TEST_EXT_STD_TUPLE_AUTO_SPECS_HPP
+
+#include <boost/hana/ext/std/tuple.hpp>
+
+#include <tuple>
+
+
+#define MAKE_TUPLE(...) ::std::make_tuple(__VA_ARGS__)
+#define TUPLE_TYPE(...) ::std::tuple<__VA_ARGS__>
+#define TUPLE_TAG ::boost::hana::ext::std::tuple_tag
+
+#endif // !BOOST_HANA_TEST_EXT_STD_TUPLE_AUTO_SPECS_HPP
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/all_of.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/all_of.cpp
new file mode 100644
index 000000000..f3e974ffd
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/all_of.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/all_of.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/any_of.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/any_of.cpp
new file mode 100644
index 000000000..3065d0175
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/any_of.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/any_of.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/ap.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/ap.cpp
new file mode 100644
index 000000000..59c9cb757
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/ap.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/ap.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/at.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/at.cpp
new file mode 100644
index 000000000..605265331
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/at.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/at.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/cartesian_product.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/cartesian_product.cpp
new file mode 100644
index 000000000..b0795e8d7
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/cartesian_product.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/cartesian_product.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/drop_back.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_back.cpp
new file mode 100644
index 000000000..b283844d6
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_back.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/drop_back.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/drop_front.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_front.cpp
new file mode 100644
index 000000000..a39d6f450
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_front.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/drop_front.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/drop_while.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_while.cpp
new file mode 100644
index 000000000..18907f033
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/drop_while.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/drop_while.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/for_each.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/for_each.cpp
new file mode 100644
index 000000000..714fe03c0
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/for_each.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/for_each.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/group.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/group.cpp
new file mode 100644
index 000000000..0669b496f
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/group.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/group.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/index_if.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/index_if.cpp
new file mode 100644
index 000000000..ef37fe65a
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/index_if.cpp
@@ -0,0 +1,9 @@
+// Copyright Louis Dionne 2013-2017
+// Copyright Jason Rice 2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/index_if.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/insert.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/insert.cpp
new file mode 100644
index 000000000..e8efc6dc1
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/insert.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/insert.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/insert_range.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/insert_range.cpp
new file mode 100644
index 000000000..05ac5774e
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/insert_range.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/insert_range.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/intersperse.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/intersperse.cpp
new file mode 100644
index 000000000..185c814a9
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/intersperse.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/intersperse.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/is_empty.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/is_empty.cpp
new file mode 100644
index 000000000..f175f7ddb
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/is_empty.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/is_empty.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/length.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/length.cpp
new file mode 100644
index 000000000..55111dd60
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/length.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/length.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/lexicographical_compare.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/lexicographical_compare.cpp
new file mode 100644
index 000000000..4d2f3edf4
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/lexicographical_compare.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/lexicographical_compare.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/make.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/make.cpp
new file mode 100644
index 000000000..f90514f16
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/make.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/make.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/none_of.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/none_of.cpp
new file mode 100644
index 000000000..b56a27b47
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/none_of.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/none_of.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/partition.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/partition.cpp
new file mode 100644
index 000000000..ba9621a6c
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/partition.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/partition.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/permutations.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/permutations.cpp
new file mode 100644
index 000000000..3c1a6e852
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/permutations.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/permutations.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/remove_at.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/remove_at.cpp
new file mode 100644
index 000000000..5b7c5af47
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/remove_at.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/remove_at.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/remove_range.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/remove_range.cpp
new file mode 100644
index 000000000..6d7c6e090
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/remove_range.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/remove_range.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/reverse.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/reverse.cpp
new file mode 100644
index 000000000..342278df8
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/reverse.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/reverse.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/scans.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/scans.cpp
new file mode 100644
index 000000000..36dd32437
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/scans.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/scans.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/sequence.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/sequence.cpp
new file mode 100644
index 000000000..4ed01e852
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/sequence.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/sequence.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/slice.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/slice.cpp
new file mode 100644
index 000000000..3e20df95f
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/slice.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/slice.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/sort.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/sort.cpp
new file mode 100644
index 000000000..f639ddeb0
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/sort.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/sort.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/span.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/span.cpp
new file mode 100644
index 000000000..297b7f174
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/span.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/span.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/take_back.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/take_back.cpp
new file mode 100644
index 000000000..2a91d7d4d
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/take_back.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/take_back.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/take_front.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/take_front.cpp
new file mode 100644
index 000000000..9a48d2b8c
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/take_front.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/take_front.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/take_while.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/take_while.cpp
new file mode 100644
index 000000000..e58c99aca
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/take_while.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/take_while.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/transform.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/transform.cpp
new file mode 100644
index 000000000..306c1bc3c
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/transform.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/transform.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/unfolds.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/unfolds.cpp
new file mode 100644
index 000000000..f8bac9ddc
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/unfolds.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/unfolds.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/unique.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/unique.cpp
new file mode 100644
index 000000000..9c1dc7155
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/unique.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/unique.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/auto/zips.cpp b/src/boost/libs/hana/test/ext/std/tuple/auto/zips.cpp
new file mode 100644
index 000000000..32ec5cc8a
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/auto/zips.cpp
@@ -0,0 +1,8 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include "_specs.hpp"
+#include <auto/zips.hpp>
+
+int main() { }
diff --git a/src/boost/libs/hana/test/ext/std/tuple/issue_90.cpp b/src/boost/libs/hana/test/ext/std/tuple/issue_90.cpp
new file mode 100644
index 000000000..dfbb4a7fc
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/issue_90.cpp
@@ -0,0 +1,73 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/at.hpp>
+#include <boost/hana/at_key.hpp>
+#include <boost/hana/back.hpp>
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/front.hpp>
+#include <boost/hana/integral_constant.hpp>
+
+#include <tuple>
+#include <utility>
+namespace hana = boost::hana;
+
+
+template <typename T>
+T const& cref(T& t) { return t; }
+
+// a non-movable, non-copyable type
+struct RefOnly {
+ RefOnly() = default;
+ RefOnly(RefOnly const&) = delete;
+ RefOnly(RefOnly&&) = delete;
+};
+
+template <int i>
+struct RefOnly_i : hana::int_<i> {
+ RefOnly_i() = default;
+ RefOnly_i(RefOnly_i const&) = delete;
+ RefOnly_i(RefOnly_i&&) = delete;
+};
+
+int main() {
+ std::tuple<RefOnly> t;
+
+ // Make sure that we return the proper reference types from `at`.
+ {
+ RefOnly&& r1 = hana::at_c<0>(std::move(t));
+ RefOnly& r2 = hana::at_c<0>(t);
+ RefOnly const& r3 = hana::at_c<0>(cref(t));
+
+ (void)r1; (void)r2; (void)r3;
+ }
+
+ // Make sure we return the proper reference types from `front`.
+ {
+ RefOnly&& r1 = hana::front(std::move(t));
+ RefOnly& r2 = hana::front(t);
+ RefOnly const& r3 = hana::front(cref(t));
+
+ (void)r1; (void)r2; (void)r3;
+ }
+
+ // Make sure we return the proper reference types from `back`.
+ {
+ RefOnly&& r1 = hana::back(std::move(t));
+ RefOnly& r2 = hana::back(t);
+ RefOnly const& r3 = hana::back(cref(t));
+
+ (void)r1; (void)r2; (void)r3;
+ }
+
+ // Make sure we return the proper reference types from `at_key`.
+ {
+ std::tuple<RefOnly_i<3>> t{};
+ RefOnly_i<3>& r1 = hana::at_key(t, RefOnly_i<3>{});
+ RefOnly_i<3> const& r2 = hana::at_key(cref(t), RefOnly_i<3>{});
+ RefOnly_i<3>&& r3 = hana::at_key(std::move(t), RefOnly_i<3>{});
+
+ (void)r1; (void)r2; (void)r3;
+ }
+}
diff --git a/src/boost/libs/hana/test/ext/std/tuple/laws.cpp b/src/boost/libs/hana/test/ext/std/tuple/laws.cpp
new file mode 100644
index 000000000..4c56bc8ee
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/laws.cpp
@@ -0,0 +1,43 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/comparable.hpp>
+#include <laws/foldable.hpp>
+#include <laws/iterable.hpp>
+#include <laws/orderable.hpp>
+#include <laws/sequence.hpp>
+
+#include <tuple>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+using hana::test::ct_ord;
+
+
+int main() {
+ auto eq_tuples = hana::make_tuple(
+ std::make_tuple()
+ , std::make_tuple(ct_eq<0>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{})
+ );
+
+ auto ord_tuples = hana::make_tuple(
+ std::make_tuple()
+ , std::make_tuple(ct_ord<0>{})
+ , std::make_tuple(ct_ord<0>{}, ct_ord<1>{})
+ , std::make_tuple(ct_ord<0>{}, ct_ord<1>{}, ct_ord<2>{})
+ , std::make_tuple(ct_ord<0>{}, ct_ord<1>{}, ct_ord<2>{}, ct_ord<3>{}, ct_ord<4>{})
+ );
+
+ hana::test::TestComparable<hana::ext::std::tuple_tag>{eq_tuples};
+ hana::test::TestOrderable<hana::ext::std::tuple_tag>{ord_tuples};
+ hana::test::TestFoldable<hana::ext::std::tuple_tag>{eq_tuples};
+ hana::test::TestIterable<hana::ext::std::tuple_tag>{eq_tuples};
+ hana::test::TestSequence<hana::ext::std::tuple_tag>{};
+}
diff --git a/src/boost/libs/hana/test/ext/std/tuple/laws.functor.cpp b/src/boost/libs/hana/test/ext/std/tuple/laws.functor.cpp
new file mode 100644
index 000000000..874d01f9b
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/laws.functor.cpp
@@ -0,0 +1,55 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/bool.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/functional/always.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/applicative.hpp>
+#include <laws/base.hpp>
+#include <laws/functor.hpp>
+#include <laws/monad.hpp>
+#include <laws/monad_plus.hpp>
+
+#include <tuple>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+
+
+int main() {
+ auto tuples = hana::make_tuple(
+ std::make_tuple()
+ , std::make_tuple(ct_eq<0>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{})
+ );
+
+ auto values = hana::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{});
+
+ auto nested_tuples = hana::make_tuple(
+ std::make_tuple()
+ , std::make_tuple(
+ std::make_tuple(ct_eq<0>{}))
+ , std::make_tuple(
+ std::make_tuple(ct_eq<0>{}),
+ std::make_tuple(ct_eq<1>{}, ct_eq<2>{}))
+ , std::make_tuple(
+ std::make_tuple(ct_eq<0>{}),
+ std::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
+ std::make_tuple(ct_eq<3>{}, ct_eq<4>{}))
+ );
+
+ auto predicates = hana::make_tuple(
+ hana::equal.to(ct_eq<0>{}), hana::equal.to(ct_eq<1>{}), hana::equal.to(ct_eq<2>{}),
+ hana::always(hana::false_c), hana::always(hana::true_c)
+ );
+
+ hana::test::TestFunctor<hana::ext::std::tuple_tag>{tuples, values};
+ hana::test::TestApplicative<hana::ext::std::tuple_tag>{tuples};
+ hana::test::TestMonad<hana::ext::std::tuple_tag>{tuples, nested_tuples};
+ hana::test::TestMonadPlus<hana::ext::std::tuple_tag>{tuples, predicates, values};
+}
diff --git a/src/boost/libs/hana/test/ext/std/tuple/laws.searchable.cpp b/src/boost/libs/hana/test/ext/std/tuple/laws.searchable.cpp
new file mode 100644
index 000000000..7eb6b42b9
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/tuple/laws.searchable.cpp
@@ -0,0 +1,38 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/bool.hpp>
+#include <boost/hana/ext/std/tuple.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/searchable.hpp>
+
+#include <tuple>
+namespace hana = boost::hana;
+using hana::test::ct_eq;
+
+
+int main() {
+ auto tuples = hana::make_tuple(
+ std::make_tuple()
+ , std::make_tuple(ct_eq<0>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{})
+ , std::make_tuple(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
+ );
+ auto keys = hana::make_tuple(ct_eq<3>{}, ct_eq<5>{}, ct_eq<7>{});
+
+ auto bool_tuples = hana::make_tuple(
+ std::make_tuple(hana::true_c)
+ , std::make_tuple(hana::false_c)
+ , std::make_tuple(hana::true_c, hana::true_c)
+ , std::make_tuple(hana::true_c, hana::false_c)
+ , std::make_tuple(hana::false_c, hana::true_c)
+ , std::make_tuple(hana::false_c, hana::false_c)
+ );
+ auto bool_keys = hana::make_tuple(hana::true_c, hana::false_c);
+
+ hana::test::TestSearchable<hana::ext::std::tuple_tag>{tuples, keys};
+ hana::test::TestSearchable<hana::ext::std::tuple_tag>{bool_tuples, bool_keys};
+}
diff --git a/src/boost/libs/hana/test/ext/std/vector.cpp b/src/boost/libs/hana/test/ext/std/vector.cpp
new file mode 100644
index 000000000..1e9e7cde1
--- /dev/null
+++ b/src/boost/libs/hana/test/ext/std/vector.cpp
@@ -0,0 +1,44 @@
+// Copyright Louis Dionne 2013-2017
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+
+#include <boost/hana/ext/std/vector.hpp>
+
+#include <boost/hana/assert.hpp>
+#include <boost/hana/tuple.hpp>
+
+#include <laws/base.hpp>
+#include <laws/comparable.hpp>
+// #include <laws/functor.hpp>
+#include <laws/orderable.hpp>
+
+#include <vector>
+namespace hana = boost::hana;
+
+
+int main() {
+ auto eqs = hana::make_tuple(
+ std::vector<hana::test::eq<0>>{0}
+ , std::vector<hana::test::eq<0>>{1}
+ , std::vector<hana::test::eq<0>>{2}
+ , std::vector<hana::test::eq<0>>{3}
+ , std::vector<hana::test::eq<0>>{4}
+ );
+
+ // auto eq_values = hana::make_tuple(hana::test::eq<0>{}, hana::test::eq<2>{});
+
+ auto ords = hana::make_tuple(
+ std::vector<hana::test::ord<0>>{0}
+ , std::vector<hana::test::ord<0>>{1}
+ , std::vector<hana::test::ord<0>>{2}
+ , std::vector<hana::test::ord<0>>{3}
+ , std::vector<hana::test::ord<0>>{4}
+ );
+
+ //////////////////////////////////////////////////////////////////////////
+ // Comparable, Orderable, Functor
+ //////////////////////////////////////////////////////////////////////////
+ hana::test::TestComparable<hana::ext::std::vector_tag>{eqs};
+ hana::test::TestOrderable<hana::ext::std::vector_tag>{ords};
+ // hana::test::TestFunctor<hana::ext::std::vector_tag>{eqs, eq_values};
+}