// 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); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // // Author(s) : Marc Glisse #ifndef CGAL_IS_ITERATOR_H #define CGAL_IS_ITERATOR_H #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_ { enum { value = ( has_iterator_category::value && has_value_type::value && has_difference_type::value && has_pointer::value && has_reference::value ) || boost::is_pointer::value }; }; template ::value> struct is_iterator_type_ { enum { value=false }; }; template struct is_iterator_type_ : //boost::is_base_of::iterator_category> boost::is_convertible::iterator_category,U> {}; } // NOTE: we don't want the real std::decay or functions are included template struct is_iterator : internal::is_iterator_::type>::type> {}; template struct is_iterator_type : internal::is_iterator_type_::type>::type,Tag> {}; template ::value> struct is_iterator_to { enum { value=false }; }; template struct is_iterator_to : boost::is_convertible::value_type,U> { }; } #endif // CGAL_IS_ITERATOR_H