// Copyright (c) 2011 INRIA Saclay Ile-de-France (France). // All rights reserved. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is part of CGAL (www.cgal.org) // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Marc Glisse #ifndef CGAL_IS_ITERATOR_H #define CGAL_IS_ITERATOR_H #include #include #include #include #include #include #include namespace CGAL { namespace internal { BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category) BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type) BOOST_MPL_HAS_XXX_TRAIT_DEF(difference_type) BOOST_MPL_HAS_XXX_TRAIT_DEF(pointer) BOOST_MPL_HAS_XXX_TRAIT_DEF(reference) //We request the type to be either a pointer or to //provide all 5 nested types provided by iterator_traits template struct is_iterator_ : public boost::mpl::or_< boost::mpl::and_< has_iterator_category, has_value_type, has_difference_type, has_pointer, has_reference >, boost::is_pointer > { }; template ::value> struct is_iterator_type_ : public boost::mpl::false_ { }; template struct is_iterator_type_ : public //boost::is_base_of::iterator_category> boost::is_convertible::iterator_category, U> { }; } // namespace internal // NOTE: we don't want the real std::decay or functions are included template struct is_iterator : public internal::is_iterator_::type>::type> { }; template struct is_iterator_type : public internal::is_iterator_type_::type>::type, Tag> { }; template ::value> struct is_iterator_to : public boost::mpl::false_ { }; template struct is_iterator_to : public boost::is_convertible::value_type, U> { }; } // namespace CGAL #endif // CGAL_IS_ITERATOR_H