summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/example/misc/nth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/hana/example/misc/nth.cpp')
-rw-r--r--src/boost/libs/hana/example/misc/nth.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/boost/libs/hana/example/misc/nth.cpp b/src/boost/libs/hana/example/misc/nth.cpp
new file mode 100644
index 000000000..ffbdf1eb8
--- /dev/null
+++ b/src/boost/libs/hana/example/misc/nth.cpp
@@ -0,0 +1,45 @@
+// 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/functional/arg.hpp>
+
+#include <cstddef>
+#include <utility>
+namespace hana = boost::hana;
+
+
+constexpr int to_int(char c)
+{ return static_cast<int>(c) - 48; }
+
+template <std::size_t N>
+constexpr long long parse(const char (&arr)[N]) {
+ long long number = 0, base = 1;
+ for (std::size_t i = 0; i < N; ++i) {
+ number += to_int(arr[N - 1 - i]) * base;
+ base *= 10;
+ }
+ return number;
+}
+
+template <char ...c>
+struct pick {
+ static constexpr unsigned long n = parse<sizeof...(c)>({c...});
+
+ template <typename ...T>
+ constexpr auto operator()(T&& ...args) const
+ { return hana::arg<n>(std::forward<T>(args)...); }
+};
+
+template <char ...c> constexpr pick<c...> operator"" _st() { return {}; }
+template <char ...c> constexpr pick<c...> operator"" _nd() { return {}; }
+template <char ...c> constexpr pick<c...> operator"" _rd() { return {}; }
+template <char ...c> constexpr pick<c...> operator"" _th() { return {}; }
+
+
+static_assert(1_st(1, '2', 3.3, 444) == 1, "");
+static_assert(2_nd(1, '2', 3.3, 444) == '2', "");
+static_assert(3_rd(1, '2', 3.3, 444) == 3.3, "");
+static_assert(4_th(1, '2', 3.3, 444) == 444, "");
+
+int main() { }