Compare commits

..

3 Commits

Author SHA1 Message Date
Michel Morin
49ab4faa2b Merge r86524 (Correct broken links to C++ standard papers); fixes #9212
[SVN r86673]
2013-11-13 03:22:55 +00:00
Beman Dawes
45295c87bc Merge 86392 from trunk. The spirit change was not applied because the file is not present in branches/release.
[SVN r86489]
2013-10-27 21:10:04 +00:00
Lorenzo Caminiti
b74489d477 Merged Boost.Parameter fixes from trunk to support accessing named paramter types tag::x::_.
[SVN r78851]
2012-06-07 18:21:25 +00:00
50 changed files with 37 additions and 22 deletions

0
doc/Jamfile.v2 Normal file → Executable file
View File

View File

@@ -37,7 +37,7 @@ can be deduced from their types.</p>
</tbody>
</table>
<!-- @jam_prefix.append('''
project test : requirements <include>. <source>/boost//headers ;''') -->
project test : requirements <include>. <implicit-dependency>/boost//headers ;''') -->
<!-- @example.prepend('''
#include <boost/parameter.hpp>
@@ -727,7 +727,7 @@ worse—think of the kinds of errors you get from your STL
implementation when you make a mistake).<a class="footnote-reference" href="#conceptcpp" id="id7"><sup>4</sup></a></li>
<li>The problems with exposing such permissive function template
signatures have been the subject of much discussion, especially
in the presence of <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#225">unqualified calls</a>. If all we want is to
in the presence of <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">unqualified calls</a>. If all we want is to
avoid unintentional argument-dependent lookup (ADL), we can
isolate <tt class="docutils literal"><span class="pre">depth_first_search</span></tt> in a namespace containing no
types<a class="footnote-reference" href="#using" id="id8"><sup>6</sup></a>, but suppose we <em>want</em> it to found via ADL?</li>
@@ -1601,7 +1601,7 @@ using boost::mpl::_;''') -->
int main()
{}''') -->
<!-- @test('run', howmany='all') -->
<p>Note that because of the <a class="reference external" href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">forwarding problem</a>, <tt class="docutils literal"><span class="pre">parameter::parameters::operator()</span></tt>
<p>Note that because of the <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">forwarding problem</a>, <tt class="docutils literal"><span class="pre">parameter::parameters::operator()</span></tt>
can't accept non-const rvalues.</p>
</div>
<div class="section" id="extracting-parameter-types">

0
doc/html/rst.css Normal file → Executable file
View File

0
doc/html/vellipsis.gif Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 62 B

After

Width:  |  Height:  |  Size: 62 B

View File

@@ -30,7 +30,7 @@ __ ../../../../index.htm
can be deduced from their types.
.. @jam_prefix.append('''
project test : requirements <include>. <source>/boost//headers ;''')
project test : requirements <include>. <implicit-dependency>/boost//headers ;''')
.. @example.prepend('''
#include <boost/parameter.hpp>
@@ -783,7 +783,7 @@ signatures.
isolate ``depth_first_search`` in a namespace containing no
types [#using]_, but suppose we *want* it to found via ADL?
__ http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#225
__ http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225
It's usually a good idea to prevent functions from being considered
for overload resolution when the passed argument types aren't
@@ -1767,7 +1767,7 @@ its function call operator:
Note that because of the `forwarding problem`_, ``parameter::parameters::operator()``
can't accept non-const rvalues.
.. _`forwarding problem`: http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm
.. _`forwarding problem`: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm
Extracting Parameter Types
==========================

0
include/boost/parameter.hpp Normal file → Executable file
View File

View File

@@ -40,11 +40,11 @@ struct use_default_tag {};
// X(something, *(predicate))
// X(something, (int))
template <class T>
template <class T, class Args>
struct cast;
template <>
struct cast<void*>
template <class Args>
struct cast<void*, Args>
{
static use_default_tag execute(use_default_tag)
{
@@ -73,27 +73,39 @@ struct cast<void*>
typedef void* voidstar;
template <class T>
struct cast<voidstar(T)>
: cast<void*>
template <class T, class Args>
struct cast<voidstar(T), Args>
: cast<void*, Args>
{
};
#else
template <class T>
struct cast<void*(T)>
: cast<void*>
template <class T, class Args>
struct cast<void*(T), Args>
: cast<void*, Args>
{
};
#endif
template <class T>
struct cast<void(T)>
// This is a hack used in cast<> to turn the user supplied type,
// which may or may not be a placeholder expression into one, so
// that it will be properly evaluated by mpl::apply.
template <class T, class Dummy = mpl::_1>
struct as_placeholder_expr
{
typedef T type;
};
template <class T, class Args>
struct cast<void(T), Args>
{
typedef typename mpl::apply2<
as_placeholder_expr<T>, Args, Args>::type type0;
typedef typename boost::add_reference<
typename boost::remove_const<T>::type
typename boost::remove_const<type0>::type
>::type reference;
static use_default_tag execute(use_default_tag)
@@ -106,7 +118,7 @@ struct cast<void(T)>
return use_default_tag();
}
static T execute(T value)
static type0 execute(type0 value)
{
return value;
}
@@ -118,9 +130,9 @@ struct cast<void(T)>
}
};
# define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) \
boost::parameter::aux::cast<void predicate>::remove_const( \
boost::parameter::aux::cast<void predicate>::execute(value) \
# define BOOST_PARAMETER_FUNCTION_CAST(value, predicate, args) \
boost::parameter::aux::cast<void predicate, args>::remove_const( \
boost::parameter::aux::cast<void predicate, args>::execute(value) \
)
# endif

0
include/boost/parameter/aux_/overloads.hpp Normal file → Executable file
View File

View File

0
include/boost/parameter/aux_/parenthesized_type.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/preprocessor/flatten.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/preprocessor/for_each.hpp Normal file → Executable file
View File

View File

0
include/boost/parameter/aux_/result_of0.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/tag.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/template_keyword.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/unwrap_cv_reference.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/void.hpp Normal file → Executable file
View File

0
include/boost/parameter/aux_/yesno.hpp Normal file → Executable file
View File

0
include/boost/parameter/binding.hpp Normal file → Executable file
View File

0
include/boost/parameter/keyword.hpp Normal file → Executable file
View File

0
include/boost/parameter/match.hpp Normal file → Executable file
View File

0
include/boost/parameter/parameters.hpp Normal file → Executable file
View File

View File

@@ -701,6 +701,7 @@ struct funptr_predicate<void**>
) \
] \
, BOOST_PARAMETER_FN_ARG_PRED(arg) \
, Args \
)
# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY(name, n, split_args, tag_namespace) \
@@ -728,6 +729,7 @@ struct funptr_predicate<void**>
BOOST_PARAMETER_FUNCTION_CAST( \
boost::parameter::aux::as_lvalue(BOOST_PARAMETER_FN_ARG_DEFAULT(arg), 0L) \
, BOOST_PARAMETER_FN_ARG_PRED(arg) \
, Args \
)
# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY(name, n, split_args, tag_ns, const_) \
@@ -843,6 +845,7 @@ struct funptr_predicate<void**>
boost::parameter::keyword<tag_ns::BOOST_PARAMETER_FN_ARG_KEYWORD(arg)>::instance \
] \
, BOOST_PARAMETER_FN_ARG_PRED(arg) \
, Args \
)
// Generates the function template that recives a ArgumentPack, and then

0
include/boost/parameter/python.hpp Normal file → Executable file
View File

0
include/boost/parameter/value_type.hpp Normal file → Executable file
View File

0
index.html Normal file → Executable file
View File

0
test/basics.cpp Normal file → Executable file
View File

0
test/basics.hpp Normal file → Executable file
View File

0
test/deduced.cpp Normal file → Executable file
View File

0
test/deduced.hpp Normal file → Executable file
View File

0
test/deduced_dependent_predicate.cpp Normal file → Executable file
View File

0
test/deduced_unmatched_arg.cpp Normal file → Executable file
View File

0
test/duplicates.cpp Normal file → Executable file
View File

0
test/earwicker.cpp Normal file → Executable file
View File

0
test/efficiency.cpp Normal file → Executable file
View File

0
test/macros.cpp Normal file → Executable file
View File

0
test/maybe.cpp Normal file → Executable file
View File

0
test/mpl.cpp Normal file → Executable file
View File

0
test/normalized_argument_types.cpp Normal file → Executable file
View File

0
test/ntp.cpp Normal file → Executable file
View File

0
test/optional_deduced_sfinae.cpp Normal file → Executable file
View File

0
test/preprocessor.cpp Normal file → Executable file
View File

0
test/preprocessor_deduced.cpp Normal file → Executable file
View File

0
test/python_test.cpp Normal file → Executable file
View File

0
test/sfinae.cpp Normal file → Executable file
View File

0
test/singular.cpp Normal file → Executable file
View File

0
test/timings.txt Normal file → Executable file
View File

0
test/tutorial.cpp Normal file → Executable file
View File

0
test/unwrap_cv_reference.cpp Normal file → Executable file
View File