// Copyright (c) 2003 Raoul M. Gough
//
// Use, modification and distribution is subject to 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)
//
// Header file element_proxy_traits.hpp
//
// Note: element_proxy.hpp must be included before this header
//
// This is a separate header so that element_proxy.hpp is not
// dependant on register_ptr_to_python.hpp. This avoids a problem with
// two-phase name lookup, where register_ptr_to_python must be
// included *after* the element_proxy overload of boost::get_pointer
// is declared.
//
// History
// =======
// 2003/10/23 rmg File creation
// 2008/12/08 Roman Change indexing suite layout
//
// $Id: element_proxy_traits.hpp,v 1.1.2.5 2003/12/05 17:36:14 raoulgough Exp $
//
#ifndef BOOST_PYTHON_INDEXING_ELEMENT_PROXY_TRAITS_HPP
#define BOOST_PYTHON_INDEXING_ELEMENT_PROXY_TRAITS_HPP
#include <indexing_suite/element_proxy.hpp>
#include <indexing_suite/value_traits.hpp>
#include <boost/python/register_ptr_to_python.hpp>
#include <boost/python/implicit.hpp>
namespace boost { namespace python { namespace indexing {
template<typename ContainerProxy>
struct element_proxy_traits
: public value_traits<
BOOST_DEDUCED_TYPENAME ContainerProxy::raw_value_type>
{
typedef element_proxy<ContainerProxy> element_proxy_type;
typedef typename ContainerProxy::raw_value_type raw_value_type;
typedef value_traits<raw_value_type> base_type;
// Wrap the base class versions of the comparisons using
// indirection
struct less
: std::binary_function<element_proxy_type, element_proxy_type, bool>
{
typename base_type::less m_base_compare;
bool operator()(
element_proxy_type const &p1, element_proxy_type const &p2) const
{
return m_base_compare (*p1, *p2);
}
};
struct equal_to
: std::binary_function<raw_value_type, element_proxy_type, bool>
{
// First param is raw_value_type to interface smoothly with the
// bind1st used in default_algorithms::find
typename base_type::equal_to m_base_compare;
bool operator()(
raw_value_type const &v, element_proxy_type const &p) const
{
return m_base_compare (v, *p);
}
};
template<typename PythonClass, typename Policy>
static void visit_container_class (PythonClass &, Policy const &)
{
register_ptr_to_python<element_proxy_type>();
implicitly_convertible<raw_value_type, element_proxy_type>();
}
};
#if !defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
// value_traits partial specialization for element_proxy instances
template<typename ContainerProxy>
struct value_traits<element_proxy<ContainerProxy> >
: element_proxy_traits<ContainerProxy>
{
};
#endif
} } }
#endif // BOOST_PYTHON_INDEXING_ELEMENT_PROXY_TRAITS_HPP