// 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 value_traits.hpp: // // Traits information for use in determining which Python methods to // support for a container with elements of a given type. // // History // ======= // 2003/ 9/12 rmg File creation // 2008/12/08 Roman Change indexing suite layout // // $Id: value_traits.hpp,v 1.1.2.6 2003/12/05 17:36:12 raoulgough Exp $ // #ifndef BOOST_PYTHON_INDEXING_VALUE_TRAITS_HPP #define BOOST_PYTHON_INDEXING_VALUE_TRAITS_HPP #include <boost/config.hpp> #include <boost/shared_ptr.hpp> #include <functional> namespace boost { namespace python { namespace indexing { // The default_value_traits template is used by all ContainerTraits // templates. It can be overridden by specialization or by supplying // the optional ValueTraits parameter to a container traits // template. template<typename T> struct value_traits; // Implementation for default use. Providing this in a separate // template allows specializations of value_traits to make use of // it. template<typename T> struct simple_value_traits { BOOST_STATIC_CONSTANT (bool, equality_comparable = true); typedef std::equal_to<T> equal_to; BOOST_STATIC_CONSTANT (bool, less_than_comparable = true); typedef std::less<T> less; // Default, do-nothing, version of visit_container_class template<typename PythonClass, typename Policy> static void visit_container_class (PythonClass &, Policy const &) { } }; // Implementation using pointer indirection template <typename Ptr> struct indirect_value_traits : simple_value_traits<Ptr> { // Hide the base class versions of the comparisons, using these // indirect versions struct less : std::binary_function<Ptr, Ptr, bool> { bool operator() (Ptr const &p1, Ptr const &p2) const { return *p1 < *p2; } }; struct equal_to : std::binary_function<Ptr, Ptr, bool> { bool operator() (Ptr const &p1, Ptr const &p2) const { return *p1 == *p2; } }; }; // Default implementation selection. It's basically just a typedef // for simple_value_traits template<typename T> struct value_traits : simple_value_traits<T> { }; #if !defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) // Partial specialization for instances of boost::shared_ptr template<typename T> struct value_traits< ::boost::shared_ptr<T> > : indirect_value_traits< ::boost::shared_ptr<T> > { }; #endif } } } #endif // BOOST_PYTHON_INDEXING_VALUE_TRAITS_HPP