]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/multi_index/include/boost/multi_index/detail/is_transparent.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / multi_index / include / boost / multi_index / detail / is_transparent.hpp
CommitLineData
7c673cae
FG
1/* Copyright 2003-2014 Joaquin M Lopez Munoz.
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
5 *
6 * See http://www.boost.org/libs/multi_index for library home page.
7 */
8
9#ifndef BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
10#define BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
11
12#if defined(_MSC_VER)
13#pragma once
14#endif
15
16#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
17#include <boost/mpl/bool.hpp>
18#include <boost/type_traits/intrinsics.hpp>
19
20namespace boost{
21
22namespace multi_index{
23
24namespace detail{
25
26/* Metafunction that checks if f(arg,arg2) executes without argument type
27 * conversion. By default (i.e. when it cannot be determined) it evaluates to
28 * true.
29 */
30
31template<typename F,typename Arg1,typename Arg2,typename=void>
32struct is_transparent:mpl::true_{};
33
34} /* namespace multi_index::detail */
35
36} /* namespace multi_index */
37
38} /* namespace boost */
39
40#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_SFINAE_EXPR)&& \
41 !defined(BOOST_NO_CXX11_DECLTYPE)&& \
42 (defined(BOOST_NO_CXX11_FINAL)||defined(BOOST_IS_FINAL))
43
44#include <boost/mpl/and.hpp>
45#include <boost/mpl/not.hpp>
46#include <boost/mpl/or.hpp>
47#include <boost/type_traits/function_traits.hpp>
48#include <boost/type_traits/is_class.hpp>
49#include <boost/type_traits/is_final.hpp>
50#include <boost/type_traits/is_function.hpp>
51#include <boost/type_traits/is_same.hpp>
52#include <boost/type_traits/remove_pointer.hpp>
53#include <boost/utility/declval.hpp>
54#include <boost/utility/enable_if.hpp>
55
56namespace boost{
57
58namespace multi_index{
59
60namespace detail{
61
62struct not_is_transparent_result_type{};
63
64template<typename F,typename Arg1,typename Arg2>
65struct is_transparent_class_helper:F
66{
67 using F::operator();
68 template<typename T,typename Q>
69 not_is_transparent_result_type operator()(const T&,const Q&)const;
70};
71
72template<typename F,typename Arg1,typename Arg2,typename=void>
73struct is_transparent_class:mpl::true_{};
74
75template<typename F,typename Arg1,typename Arg2>
76struct is_transparent_class<
77 F,Arg1,Arg2,
78 typename enable_if<
79 is_same<
80 decltype(
81 declval<const is_transparent_class_helper<F,Arg1,Arg2> >()(
82 declval<const Arg1&>(),declval<const Arg2&>())
83 ),
84 not_is_transparent_result_type
85 >
86 >::type
87>:mpl::false_{};
88
89template<typename F,typename Arg1,typename Arg2>
90struct is_transparent<
91 F,Arg1,Arg2,
92 typename enable_if<
93 mpl::and_<
94 is_class<F>,
95 mpl::not_<is_final<F> > /* is_transparent_class_helper derives from F */
96 >
97 >::type
98>:is_transparent_class<F,Arg1,Arg2>{};
99
100template<typename F,typename Arg1,typename Arg2,typename=void>
101struct is_transparent_function:mpl::true_{};
102
103template<typename F,typename Arg1,typename Arg2>
104struct is_transparent_function<
105 F,Arg1,Arg2,
106 typename enable_if<
107 mpl::or_<
108 mpl::not_<mpl::or_<
109 is_same<typename function_traits<F>::arg1_type,const Arg1&>,
110 is_same<typename function_traits<F>::arg1_type,Arg1>
111 > >,
112 mpl::not_<mpl::or_<
113 is_same<typename function_traits<F>::arg2_type,const Arg2&>,
114 is_same<typename function_traits<F>::arg2_type,Arg2>
115 > >
116 >
117 >::type
118>:mpl::false_{};
119
120template<typename F,typename Arg1,typename Arg2>
121struct is_transparent<
122 F,Arg1,Arg2,
123 typename enable_if<
124 is_function<typename remove_pointer<F>::type>
125 >::type
126>:is_transparent_function<typename remove_pointer<F>::type,Arg1,Arg2>{};
127
128} /* namespace multi_index::detail */
129
130} /* namespace multi_index */
131
132} /* namespace boost */
133
134#endif
135#endif