X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2Ftype_traits.hh;h=fc1b0a53458c3a4741b57c59cfc15aa26f1941cd;hb=5b2e9a63a43027c71ac470ac9bdecb72e8974951;hp=19b234521ed1fa64c18674ad5b516dc658d554de;hpb=3fe2ed38b800bcb57afff676698462e763724245;p=senf.git diff --git a/senf/Utils/type_traits.hh b/senf/Utils/type_traits.hh index 19b2345..fc1b0a5 100644 --- a/senf/Utils/type_traits.hh +++ b/senf/Utils/type_traits.hh @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2008 +// Copyright (C) 2008 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund @@ -36,7 +36,7 @@ #include #include "type_traits.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { @@ -45,7 +45,7 @@ namespace senf */ ///\addtogroup typetraits - ///\{ + //\{ /** \brief Strip first parameter from function traits @@ -54,12 +54,12 @@ namespace senf If the function described in \a Traits does not take any arguments, it is returned unchanged. - + \code typedef boost::function_traits traits - BOOST_STATIC_ASSERT(( boost::is_same< - senf::function_traits_remove_arg< traits >::type, - boost::function_traits + BOOST_STATIC_ASSERT(( boost::is_same< + senf::function_traits_remove_arg< traits >::type, + boost::function_traits >::value )); \endcode @@ -69,7 +69,7 @@ namespace senf struct function_traits_remove_arg {}; /** \brief Get argument type from function traits - + function_traits_arg will return the type of the \a index-th argument from \a Traits. If the function has no argument at that index, \c void is returned @@ -77,18 +77,18 @@ namespace senf typedef boost::function_traits traits; BOOST_STATIC_ASSERT(( boost:is_same< senf::function_traits_arg_type< traits, 0 >::type, - int + int >::value )); BOOST_STATIC_ASSERT(( boost::is_same< senf::function_traits_arg_type< traits, 2 >::type, void >::value )); \endcode - + \tparam Traits \c boost::function_traits instantiation \tparam index 0 based argument index */ - template < class Traits, int index, bool flag = (index < Traits::arity) > + template < class Traits, int index, bool flag = (index < Traits::arity) > struct function_traits_arg_type {}; #ifndef DOXYGEN @@ -107,12 +107,12 @@ namespace senf will be returned unchanged. \code - BOOST_STATIC_ASSERT(( boost::is_same< - senf::remove_member_pointer< int (Class::*) >::type, - int + BOOST_STATIC_ASSERT(( boost::is_same< + senf::remove_member_pointer< int (Class::*) >::type, + int >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< - senf::remove_member_pointer< void (Class::*)(int) >::type, + BOOST_STATIC_ASSERT(( boost::is_same< + senf::remove_member_pointer< void (Class::*)(int) >::type, void (int) >::value )); \endcode @@ -160,7 +160,7 @@ namespace senf { typedef void type; }; - + #ifndef DOXYGEN template < class C, class T > struct member_class @@ -179,14 +179,14 @@ namespace senf This meta function will remove a plain or member pointer from the given type. If \a T is neither a member pointer nor an ordinary pointer, \a T will be returned unchanged. - + \code - BOOST_STATIC_ASSERT(( boost::is_same< - senf::remove_any_pointer< int (Class::*) >::type, + BOOST_STATIC_ASSERT(( boost::is_same< + senf::remove_any_pointer< int (Class::*) >::type, int >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< - senf::remove_any_pointer< void (Class::*)(int) >::type, + BOOST_STATIC_ASSERT(( boost::is_same< + senf::remove_any_pointer< void (Class::*)(int) >::type, void (int) > ); BOOST_STATIC_ASSERT(( boost::is_same< senf::remove_any_pointer < int (*)() >::type, @@ -206,7 +206,7 @@ namespace senf {}; /** \brief Test object if it is a function or member-function (pointer) - + is_any_function will inherit from \c boost::true_type, when \a T is a function type, function pointer type or a member function pointer type. Otherwise, it will inherit from \c boost::false_type. @@ -226,7 +226,7 @@ namespace senf {}; /** \brief Remove reference and CV qualification from type - + remove_cvref will remove all the 'ornaments' from a type as typically used to pass arguments: references and any CV spec. It will thus convert a typical argument type into it's basic type. @@ -243,6 +243,15 @@ namespace senf : public boost::remove_cv< typename boost::remove_reference::type > {}; + /** \brief Get arity of function T + + \a T may be any function like type: function, pointer to function or (pointer to) + member-function. + + \code + BOOST_STATIC_ASSERT(( senf::function_arity::value == 1 )); + \endcode + */ template < class T > struct function_arity : public boost::integral_constant< @@ -251,7 +260,29 @@ namespace senf typename senf::remove_any_pointer::type>::arity> {}; - ///} + /** Test object if it is any \c std::pair type + + if \a Pair is any \c std::pair type, this trait will inherit from \c boost::true_type, + otherwise it will inherit from \c boost::false_type. + + \code + BOOST_STATIC_ASSERT(( senf::is_pair< std::pair >::value )); + BOOST_STATIC_ASSERT(( ! senf::is_pair< void () >::value )); + \endcode + */ + template + struct is_pair + : public boost::false_type + {}; + +#ifndef DOXYGEN + template + struct is_pair< std::pair > + : public boost::true_type + {}; +#endif + + //\} #ifndef DOXYGEN @@ -264,7 +295,7 @@ namespace senf } -///////////////////////////////hh.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// //#include "type_traits.cci" //#include "type_traits.ct" //#include "type_traits.cti"