// 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: https://github.com/CGAL/cgal/blob/v5.1/STL_Extension/include/CGAL/is_iterator.h $ // $Id: is_iterator.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot // 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 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