blob: 68ddd184869bf7fe79a9ecf85747f878f88b0f8f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
/*!
@file
Adapts Boost.MPL IntegralConstants for use with Hana.
@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_EXT_BOOST_MPL_INTEGRAL_C_HPP
#define BOOST_HANA_EXT_BOOST_MPL_INTEGRAL_C_HPP
#include <boost/hana/concept/integral_constant.hpp>
#include <boost/hana/config.hpp>
#include <boost/hana/core/tag_of.hpp>
#include <boost/hana/core/when.hpp>
#include <boost/hana/fwd/core/to.hpp>
#include <boost/mpl/integral_c.hpp>
#include <boost/mpl/integral_c_tag.hpp>
#include <type_traits>
#ifdef BOOST_HANA_DOXYGEN_INVOKED
namespace boost { namespace mpl {
//! @ingroup group-ext-mpl
//! Adapter for IntegralConstants from the Boost.MPL.
//!
//! Provided models
//! ---------------
//! 1. `Constant` and `IntegralConstant`\n
//! A Boost.MPL IntegralConstant is a model of the `IntegralConstant`
//! and `Constant` concepts just like `hana::integral_constant`s are.
//! As a consequence, they are also implicitly a model of the concepts
//! provided for all models of `Constant`.
//! @include example/ext/boost/mpl/integral_c/integral_constant.cpp
template <typename T, T v>
struct integral_c { };
}}
#endif
BOOST_HANA_NAMESPACE_BEGIN
namespace ext { namespace boost { namespace mpl {
template <typename T>
struct integral_c_tag { using value_type = T; };
}}}
template <typename T>
struct tag_of<T, when<
std::is_same<
typename T::tag,
::boost::mpl::integral_c_tag
>::value
>> {
using type = ext::boost::mpl::integral_c_tag<
typename hana::tag_of<typename T::value_type>::type
>;
};
//////////////////////////////////////////////////////////////////////////
// IntegralConstant/Constant
//////////////////////////////////////////////////////////////////////////
template <typename T>
struct IntegralConstant<ext::boost::mpl::integral_c_tag<T>> {
static constexpr bool value = true;
};
template <typename T, typename C>
struct to_impl<ext::boost::mpl::integral_c_tag<T>, C,
when<hana::IntegralConstant<C>::value>
> : embedding<is_embedded<typename C::value_type, T>::value> {
template <typename N>
static constexpr auto apply(N const&) {
return ::boost::mpl::integral_c<T, N::value>{};
}
};
BOOST_HANA_NAMESPACE_END
#endif // !BOOST_HANA_EXT_BOOST_MPL_INTEGRAL_C_HPP
|