annotate DEPENDENCIES/generic/include/boost/parameter/aux_/cast.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright Daniel Wallin 2006. Use, modification and distribution is
Chris@16 2 // subject to the Boost Software License, Version 1.0. (See accompanying
Chris@16 3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 4
Chris@16 5 #ifndef BOOST_PARAMETER_CAST_060902_HPP
Chris@16 6 # define BOOST_PARAMETER_CAST_060902_HPP
Chris@16 7
Chris@16 8 # include <boost/detail/workaround.hpp>
Chris@16 9
Chris@16 10 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
Chris@16 11 && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
Chris@16 12 # include <boost/type_traits/add_reference.hpp>
Chris@16 13 # include <boost/type_traits/remove_const.hpp>
Chris@16 14 # endif
Chris@16 15
Chris@16 16 namespace boost { namespace parameter { namespace aux {
Chris@16 17
Chris@16 18 struct use_default_tag {};
Chris@16 19
Chris@16 20 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
Chris@16 21 || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
Chris@16 22
Chris@16 23 # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) value
Chris@16 24
Chris@16 25 # else
Chris@16 26
Chris@16 27 // Handles possible implicit casts. Used by preprocessor.hpp to
Chris@16 28 // normalize user input.
Chris@16 29 //
Chris@16 30 // cast<void*>::execute() is identity
Chris@16 31 // cast<void*(X)>::execute() is identity
Chris@16 32 // cast<void(X)>::execute() casts to X
Chris@16 33 //
Chris@16 34 // preprocessor.hpp uses this like this:
Chris@16 35 //
Chris@16 36 // #define X(value, predicate)
Chris@16 37 // cast<void predicate>::execute(value)
Chris@16 38 //
Chris@16 39 // X(something, *)
Chris@16 40 // X(something, *(predicate))
Chris@16 41 // X(something, (int))
Chris@16 42
Chris@16 43 template <class T, class Args>
Chris@16 44 struct cast;
Chris@16 45
Chris@16 46 template <class Args>
Chris@16 47 struct cast<void*, Args>
Chris@16 48 {
Chris@16 49 static use_default_tag execute(use_default_tag)
Chris@16 50 {
Chris@16 51 return use_default_tag();
Chris@16 52 }
Chris@16 53
Chris@16 54 static use_default_tag remove_const(use_default_tag)
Chris@16 55 {
Chris@16 56 return use_default_tag();
Chris@16 57 }
Chris@16 58
Chris@16 59 template <class U>
Chris@16 60 static U& execute(U& value)
Chris@16 61 {
Chris@16 62 return value;
Chris@16 63 }
Chris@16 64
Chris@16 65 template <class U>
Chris@16 66 static U& remove_const(U& x)
Chris@16 67 {
Chris@16 68 return x;
Chris@16 69 }
Chris@16 70 };
Chris@16 71
Chris@16 72 #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))
Chris@16 73
Chris@16 74 typedef void* voidstar;
Chris@16 75
Chris@16 76 template <class T, class Args>
Chris@16 77 struct cast<voidstar(T), Args>
Chris@16 78 : cast<void*, Args>
Chris@16 79 {
Chris@16 80 };
Chris@16 81
Chris@16 82 #else
Chris@16 83
Chris@16 84 template <class T, class Args>
Chris@16 85 struct cast<void*(T), Args>
Chris@16 86 : cast<void*, Args>
Chris@16 87 {
Chris@16 88 };
Chris@16 89
Chris@16 90 #endif
Chris@16 91
Chris@16 92 // This is a hack used in cast<> to turn the user supplied type,
Chris@16 93 // which may or may not be a placeholder expression into one, so
Chris@16 94 // that it will be properly evaluated by mpl::apply.
Chris@16 95 template <class T, class Dummy = mpl::_1>
Chris@16 96 struct as_placeholder_expr
Chris@16 97 {
Chris@16 98 typedef T type;
Chris@16 99 };
Chris@16 100
Chris@16 101 template <class T, class Args>
Chris@16 102 struct cast<void(T), Args>
Chris@16 103 {
Chris@16 104 typedef typename mpl::apply2<
Chris@16 105 as_placeholder_expr<T>, Args, Args>::type type0;
Chris@16 106
Chris@16 107 typedef typename boost::add_reference<
Chris@16 108 typename boost::remove_const<type0>::type
Chris@16 109 >::type reference;
Chris@16 110
Chris@16 111 static use_default_tag execute(use_default_tag)
Chris@16 112 {
Chris@16 113 return use_default_tag();
Chris@16 114 }
Chris@16 115
Chris@16 116 static use_default_tag remove_const(use_default_tag)
Chris@16 117 {
Chris@16 118 return use_default_tag();
Chris@16 119 }
Chris@16 120
Chris@16 121 static type0 execute(type0 value)
Chris@16 122 {
Chris@16 123 return value;
Chris@16 124 }
Chris@16 125
Chris@16 126 template <class U>
Chris@16 127 static reference remove_const(U const& x)
Chris@16 128 {
Chris@16 129 return const_cast<reference>(x);
Chris@16 130 }
Chris@16 131 };
Chris@16 132
Chris@16 133 # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate, args) \
Chris@16 134 boost::parameter::aux::cast<void predicate, args>::remove_const( \
Chris@16 135 boost::parameter::aux::cast<void predicate, args>::execute(value) \
Chris@16 136 )
Chris@16 137
Chris@16 138 # endif
Chris@16 139
Chris@16 140 }}} // namespace boost::parameter::aux
Chris@16 141
Chris@16 142 #endif // BOOST_PARAMETER_CAST_060902_HPP
Chris@16 143