// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
-// Stefan Bund <g0dil@berlios.de>
//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+// http://senf.berlios.de/license.html
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on,
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the
-// Free Software Foundation, Inc.,
-// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+// All Rights Reserved.
+//
+// Contributor(s):
+// Stefan Bund <g0dil@berlios.de>
/** \file
\brief type_traits public header */
#include <senf/config.hh>
#include "type_traits.mpp"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace senf
{
*/
///\addtogroup typetraits
- ///\{
+ //\{
/** \brief Strip first parameter from function traits
If the function described in \a Traits does not take any arguments, it is returned
unchanged.
-
+
\code
typedef boost::function_traits<void (int, double)> traits
- BOOST_STATIC_ASSERT(( boost::is_same<
- senf::function_traits_remove_arg< traits >::type,
- boost::function_traits<void (double)>
+ BOOST_STATIC_ASSERT(( boost::is_same<
+ senf::function_traits_remove_arg< traits >::type,
+ boost::function_traits<void (double)>
>::value ));
\endcode
struct function_traits_remove_arg {};
/** \brief Get argument type from function traits
-
+
function_traits_arg<Traits, index> 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
typedef boost::function_traits<void (int, double)> 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
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
{
typedef void type;
};
-
+
#ifndef DOXYGEN
template < class C, class T > struct member_class <T (C::*) >
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,
{};
/** \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.
{};
/** \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.
: public boost::remove_cv< typename boost::remove_reference<T>::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<void (Class::*)(int)>::value == 1 ));
+ \endcode
+ */
template < class T >
struct function_arity
: public boost::integral_constant<
typename senf::remove_any_pointer<T>::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<int,void*> >::value ));
+ BOOST_STATIC_ASSERT(( ! senf::is_pair< void () >::value ));
+ \endcode
+ */
+ template <class Pair>
+ struct is_pair
+ : public boost::false_type
+ {};
+
+#ifndef DOXYGEN
+ template <class First, class Second>
+ struct is_pair< std::pair<First,Second> >
+ : public boost::true_type
+ {};
+#endif
+
+ //\}
#ifndef DOXYGEN
}
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
//#include "type_traits.cci"
//#include "type_traits.ct"
//#include "type_traits.cti"