annotate DEPENDENCIES/generic/include/boost/concept/requires.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 c530137014c0
children
rev   line source
Chris@16 1 // Copyright David Abrahams 2006. Distributed under the Boost
Chris@16 2 // 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 #ifndef BOOST_CONCEPT_REQUIRES_DWA2006430_HPP
Chris@16 5 # define BOOST_CONCEPT_REQUIRES_DWA2006430_HPP
Chris@16 6
Chris@16 7 # include <boost/config.hpp>
Chris@16 8 # include <boost/concept/assert.hpp>
Chris@16 9 # include <boost/preprocessor/seq/for_each.hpp>
Chris@16 10
Chris@16 11 namespace boost {
Chris@16 12
Chris@101 13 // unaryfunptr_arg_type from parameter/aux_/parenthesized_type.hpp
Chris@101 14
Chris@101 15 namespace ccheck_aux {
Chris@101 16
Chris@101 17 // A metafunction that transforms void(*)(T) -> T
Chris@101 18 template <class UnaryFunctionPointer>
Chris@101 19 struct unaryfunptr_arg_type;
Chris@101 20
Chris@101 21 template <class Arg>
Chris@101 22 struct unaryfunptr_arg_type<void(*)(Arg)>
Chris@101 23 {
Chris@101 24 typedef Arg type;
Chris@101 25 };
Chris@101 26
Chris@101 27 template <>
Chris@101 28 struct unaryfunptr_arg_type<void(*)(void)>
Chris@101 29 {
Chris@101 30 typedef void type;
Chris@101 31 };
Chris@101 32
Chris@101 33 } // namespace ccheck_aux
Chris@101 34
Chris@16 35 // Template for use in handwritten assertions
Chris@16 36 template <class Model, class More>
Chris@16 37 struct requires_ : More
Chris@16 38 {
Chris@16 39 BOOST_CONCEPT_ASSERT((Model));
Chris@16 40 };
Chris@16 41
Chris@16 42 // Template for use by macros, where models must be wrapped in parens.
Chris@16 43 // This isn't in namespace detail to keep extra cruft out of resulting
Chris@16 44 // error messages.
Chris@16 45 template <class ModelFn>
Chris@16 46 struct _requires_
Chris@16 47 {
Chris@16 48 enum { value = 0 };
Chris@16 49 BOOST_CONCEPT_ASSERT_FN(ModelFn);
Chris@16 50 };
Chris@16 51
Chris@16 52 template <int check, class Result>
Chris@101 53 struct Requires_ : ::boost::ccheck_aux::unaryfunptr_arg_type<Result>
Chris@16 54 {
Chris@16 55 };
Chris@16 56
Chris@16 57 # if BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1010))
Chris@16 58 # define BOOST_CONCEPT_REQUIRES_(r,data,t) | (::boost::_requires_<void(*)t>::value)
Chris@16 59 # else
Chris@16 60 # define BOOST_CONCEPT_REQUIRES_(r,data,t) + (::boost::_requires_<void(*)t>::value)
Chris@16 61 # endif
Chris@16 62
Chris@101 63 #if defined(NDEBUG)
Chris@16 64
Chris@16 65 # define BOOST_CONCEPT_REQUIRES(models, result) \
Chris@101 66 typename ::boost::ccheck_aux::unaryfunptr_arg_type<void(*)result>::type
Chris@16 67
Chris@16 68 #elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
Chris@16 69
Chris@16 70 // Same thing as below without the initial typename
Chris@16 71 # define BOOST_CONCEPT_REQUIRES(models, result) \
Chris@16 72 ::boost::Requires_< \
Chris@16 73 (0 BOOST_PP_SEQ_FOR_EACH(BOOST_CONCEPT_REQUIRES_, ~, models)), \
Chris@101 74 ::boost::ccheck_aux::unaryfunptr_arg_type<void(*)result> \
Chris@16 75 >::type
Chris@16 76
Chris@16 77 #else
Chris@16 78
Chris@16 79 // This just ICEs on MSVC6 :(
Chris@16 80 # define BOOST_CONCEPT_REQUIRES(models, result) \
Chris@16 81 typename ::boost::Requires_< \
Chris@16 82 (0 BOOST_PP_SEQ_FOR_EACH(BOOST_CONCEPT_REQUIRES_, ~, models)), \
Chris@16 83 void(*)result \
Chris@16 84 >::type
Chris@16 85
Chris@16 86 #endif
Chris@16 87
Chris@16 88 // C++0x proposed syntax changed. This supports an older usage
Chris@16 89 #define BOOST_CONCEPT_WHERE(models,result) BOOST_CONCEPT_REQUIRES(models,result)
Chris@16 90
Chris@16 91 } // namespace boost::concept_check
Chris@16 92
Chris@16 93 #endif // BOOST_CONCEPT_REQUIRES_DWA2006430_HPP