/usr/include/boost/detail
Edit: /usr/include/boost/detail/named_template_params.hpp (6124B)
// (C) Copyright Jeremy Siek 2001.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Revision History:
// 04 Oct 2001 David Abrahams
// Changed name of "bind" to "select" to avoid problems with MSVC.
#ifndef BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP
#define BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP
#include
#include
#include // for is_reference
#if defined(BOOST_BORLANDC)
#include
#endif
namespace boost {
namespace detail {
struct default_argument { };
struct dummy_default_gen {
template
struct select {
typedef default_argument type;
};
};
// This class template is a workaround for MSVC.
template struct default_generator {
typedef detail::dummy_default_gen type;
};
template struct is_default {
enum { value = false };
typedef type_traits::no_type type;
};
template <> struct is_default {
enum { value = true };
typedef type_traits::yes_type type;
};
struct choose_default {
template
struct select {
typedef typename default_generator::type Gen;
typedef typename Gen::template select::type type;
};
};
struct choose_arg {
template
struct select {
typedef Arg type;
};
};
#if defined(BOOST_BORLANDC)
template
struct choose_arg_or_default { typedef choose_arg type; };
template <>
struct choose_arg_or_default {
typedef choose_default type;
};
#else
template
struct choose_arg_or_default { typedef choose_arg type; };
template <>
struct choose_arg_or_default {
typedef choose_default type;
};
#endif
template
class resolve_default {
#if defined(BOOST_BORLANDC)
typedef typename choose_arg_or_default::type>::type Selector;
#else
// This usually works for Borland, but I'm seeing weird errors in
// iterator_adaptor_test.cpp when using this method.
enum { is_def = is_default::value };
typedef typename choose_arg_or_default::type Selector;
#endif
public:
typedef typename Selector
::template select::type type;
};
// To differentiate an unnamed parameter from a traits generator
// we use is_convertible.
struct named_template_param_base { };
template
struct is_named_param_list {
enum { value = is_convertible::value };
};
struct choose_named_params {
template struct select { typedef Prev type; };
};
struct choose_default_arg {
template struct select {
typedef detail::default_argument type;
};
};
template struct choose_default_dispatch_;
template <> struct choose_default_dispatch_ {
typedef choose_named_params type;
};
template <> struct choose_default_dispatch_ {
typedef choose_default_arg type;
};
// The use of inheritance here is a Solaris Forte 6 workaround.
template struct choose_default_dispatch
: public choose_default_dispatch_ { };
template
struct choose_default_argument {
enum { is_named = is_named_param_list::value };
typedef typename choose_default_dispatch::type Selector;
typedef typename Selector::template select::type type;
};
// This macro assumes that there is a class named default_##TYPE
// defined before the application of the macro. This class should
// have a single member class template named "select" with two
// template parameters: the type of the class being created (e.g.,
// the iterator_adaptor type when creating iterator adaptors) and
// a traits class. The select class should have a single typedef
// named "type" that produces the default for TYPE. See
// boost/iterator_adaptors.hpp for an example usage. Also,
// applications of this macro must be placed in namespace
// boost::detail.
#define BOOST_NAMED_TEMPLATE_PARAM(TYPE) \
struct get_##TYPE##_from_named { \
template \
struct select { \
typedef typename NamedParams::traits NamedTraits; \
typedef typename NamedTraits::TYPE TYPE; \
typedef typename resolve_default::type type; \
}; \
}; \
struct pass_thru_##TYPE { \
template struct select { \
typedef typename resolve_default::type type; \
};\
}; \
template \
struct get_##TYPE##_dispatch { }; \
template <> struct get_##TYPE##_dispatch<1> { \
typedef get_##TYPE##_from_named type; \
}; \
template <> struct get_##TYPE##_dispatch<0> { \
typedef pass_thru_##TYPE type; \
}; \
template \
class get_##TYPE { \
enum { is_named = is_named_param_list::value }; \
typedef typename get_##TYPE##_dispatch::type Selector; \
public: \
typedef typename Selector::template select::type type; \
}; \
template <> struct default_generator { \
typedef default_##TYPE type; \
}
} // namespace detail
} // namespace boost
#endif // BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP