diff options
Diffstat (limited to 'boost/convert/detail/is_converter.hpp')
-rw-r--r-- | boost/convert/detail/is_converter.hpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/boost/convert/detail/is_converter.hpp b/boost/convert/detail/is_converter.hpp new file mode 100644 index 0000000000..b35470cd19 --- /dev/null +++ b/boost/convert/detail/is_converter.hpp @@ -0,0 +1,47 @@ +// Copyright (c) 2009-2014 Vladimir Batov. +// Use, modification and distribution are subject to the Boost Software License, +// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt. + +#ifndef BOOST_CONVERT_IS_CONVERTER_HPP +#define BOOST_CONVERT_IS_CONVERTER_HPP + +#include <boost/convert/detail/forward.hpp> +#include <boost/convert/detail/is_callable.hpp> +#include <boost/utility/enable_if.hpp> +#include <boost/type_traits.hpp> +#include <boost/ref.hpp> + +namespace boost { namespace cnv +{ + template<typename, typename, typename, typename =void> + struct is_cnv { BOOST_STATIC_CONSTANT(bool, value = false); }; + + template<typename Class, typename TypeIn, typename TypeOut> + struct is_cnv<Class, TypeIn, TypeOut, typename enable_if<is_class<Class>, void>::type> + { + typedef typename ::boost::unwrap_reference<Class>::type class_type; + typedef void signature_type(TypeIn const&, optional<TypeOut>&); + + BOOST_DECLARE_IS_CALLABLE(is_callable, operator()); + + BOOST_STATIC_CONSTANT(bool, value = (is_callable<class_type, signature_type>::value)); + }; + + template<typename Function, typename TypeIn, typename TypeOut> + struct is_cnv<Function, TypeIn, TypeOut, + typename enable_if_c<is_function<Function>::value && function_types::function_arity<Function>::value == 2, + void>::type> + { + typedef TypeIn in_type; + typedef optional<TypeOut>& out_type; + typedef typename function_traits<Function>::arg1_type func_in_type; + typedef typename function_traits<Function>::arg2_type func_out_type; + + BOOST_STATIC_CONSTANT(bool, in_good = (is_convertible<in_type, func_in_type>::value)); + BOOST_STATIC_CONSTANT(bool, out_good = (is_same<out_type, func_out_type>::value)); + BOOST_STATIC_CONSTANT(bool, value = (in_good && out_good)); + }; +}} + +#endif // BOOST_CONVERT_IS_CONVERTER_HPP + |