mirror of
https://github.com/boostorg/iterator.git
synced 2025-12-18 03:28:30 +01:00
С++03 support was deprecated in 1.85 and now can be removed. This PR clears many of workarounds, which are no longer needed now. * Remove unused workaround macros (many of). * Remove BOOST_STATIC_ASSERT usages. * Minimize Boost::type_traits dependency (in favour of STL's type_traits). Closes https://github.com/boostorg/iterator/pull/82. Squashed commit of the following: commit741a627b73Author: Georgy Guminov <gogagum@gmail.com> Date: Sat Jan 25 12:13:05 2025 +0300 Replace testers with standard metafunctions. commitbf4cce6114Author: Georgy Guminov <gogagum@gmail.com> Date: Sat Jan 25 11:51:32 2025 +0300 Refactor is_lvalue_iterator.hpp. commit8d080c6c58Author: Georgy Guminov <gogagum@gmail.com> Date: Sat Jan 25 10:27:32 2025 +0300 Remove more workarounds. commit5a4ba24d36Author: Georgy Guminov <gogagum@gmail.com> Date: Sun Jan 19 16:38:30 2025 +0300 Fixes. commitfdfafce2b9Author: Georgy Guminov <gogagum@gmail.com> Date: Sat Oct 26 15:06:43 2024 +0300 Remove BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY Correct static_assert messages. Fix messages & replace is_standard_layout with is_copy_constructible. commitc69ac1408aAuthor: Georgy Guminov <gogagum@gmail.com> Date: Sat Oct 26 14:48:51 2024 +0300 Correct static_assert messages. commitb5df827151Author: Georqy Guminov <gogagum@gmail.com> Date: Sun Jun 23 16:12:29 2024 +0300 Fixes. Remove some Boost.MPL usages. Remove unused includes. commit01fd35e9f8Author: Georgiy Guminov <gogagum@gmail.com> Date: Wed Jun 12 17:14:21 2024 +0300 abstract conjunction. commitc02def8acfAuthor: Georgiy Guminov <gogagum@gmail.com> Date: Wed Jun 12 16:35:43 2024 +0300 return addressof & conjunction. commit3b3d162575Author: Georgiy Guminov <gogagum@gmail.com> Date: Wed Jun 12 16:30:44 2024 +0300 Make macro more readable. commit4ab19e045fAuthor: Georgiy Guminov <gogagum@gmail.com> Date: Wed Jun 12 15:56:49 2024 +0300 Add static_assert messages. commit82b5c44cd3Author: Georgiy Guminov <gogagum@gmail.com> Date: Wed Jun 12 14:12:10 2024 +0300 Return is iterator CXX17 test. commit2d58d65462Author: Georgiy Guminov <gogagum@gmail.com> Date: Tue Jun 11 14:04:17 2024 +0300 Omitted. commita0d04d9491Author: Georgiy Guminov <gogagum@gmail.com> Date: Tue Jun 11 14:00:35 2024 +0300 Replace move with static_cast commit4a49b8a1a2Author: Georgiy Guminov <gogagum@gmail.com> Date: Mon Jun 10 21:38:53 2024 +0300 Return BOOST_NOEXCEPT commit054c013bbaAuthor: Georgiy Guminov <gogagum@gmail.com> Date: Sun Jun 9 15:20:41 2024 +0300 CXX11
149 lines
4.0 KiB
C++
149 lines
4.0 KiB
C++
/*
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* https://www.boost.org/LICENSE_1_0.txt)
|
|
*
|
|
* Copyright (c) 2023 Andrey Semashev
|
|
*/
|
|
/*!
|
|
* \file iterator/is_iterator.hpp
|
|
*
|
|
* This header contains definition of the \c is_iterator type trait.
|
|
*/
|
|
|
|
#ifndef BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|
|
#define BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|
|
|
|
#include <cstddef>
|
|
#include <boost/config.hpp>
|
|
#include <boost/type_traits/is_complete.hpp>
|
|
#include <boost/iterator/detail/type_traits/conjunction.hpp>
|
|
#include <boost/iterator/detail/type_traits/negation.hpp>
|
|
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
|
#include <iterator>
|
|
#endif
|
|
|
|
#include <type_traits>
|
|
|
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
|
#pragma once
|
|
#endif
|
|
|
|
namespace boost {
|
|
namespace iterators {
|
|
namespace detail {
|
|
|
|
// The trait attempts to detect if the T type is an iterator class. Class-type iterators are assumed
|
|
// to have the nested type iterator_category. Strictly speaking, this is not required to be the
|
|
// case (e.g. a user can specialize iterator_traits for T without defining T::iterator_category).
|
|
// Still, this is a good heuristic in practice, and we can't do anything better anyway.
|
|
// Since C++17 we can test for iterator_traits<T>::iterator_category presence instead as it is
|
|
// required to be only present for iterators.
|
|
namespace has_iterator_category_detail {
|
|
|
|
typedef char yes_type;
|
|
struct no_type { char padding[2]; };
|
|
|
|
template< typename T >
|
|
yes_type check(
|
|
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
|
typename std::iterator_traits< T >::iterator_category*
|
|
#else
|
|
typename T::iterator_category*
|
|
#endif
|
|
);
|
|
template< typename >
|
|
no_type check(...);
|
|
|
|
} // namespace has_iterator_category_detail
|
|
|
|
template< typename T >
|
|
struct is_iterator_impl :
|
|
public std::integral_constant<
|
|
bool,
|
|
sizeof(has_iterator_category_detail::check<T>(0)) == sizeof(has_iterator_category_detail::yes_type)
|
|
>
|
|
{
|
|
};
|
|
|
|
template< typename T >
|
|
struct is_iterator_impl< T* > :
|
|
public conjunction<
|
|
boost::is_complete<T>,
|
|
negation< std::is_function< T > >
|
|
>::type
|
|
{
|
|
};
|
|
|
|
template< typename T, typename U >
|
|
struct is_iterator_impl< T U::* > :
|
|
public std::false_type
|
|
{
|
|
};
|
|
|
|
template< typename T >
|
|
struct is_iterator_impl<T&> :
|
|
public std::false_type
|
|
{
|
|
};
|
|
|
|
template< typename T, std::size_t N >
|
|
struct is_iterator_impl< T[N] > :
|
|
public std::false_type
|
|
{
|
|
};
|
|
|
|
#if !defined(BOOST_TT_HAS_WORKING_IS_COMPLETE)
|
|
template< typename T >
|
|
struct is_iterator_impl< T[] > :
|
|
public std::false_type
|
|
{
|
|
};
|
|
|
|
template< >
|
|
struct is_iterator_impl< void > :
|
|
public std::false_type
|
|
{
|
|
};
|
|
|
|
template< >
|
|
struct is_iterator_impl< void* > :
|
|
public std::false_type
|
|
{
|
|
};
|
|
#endif // !defined(BOOST_TT_HAS_WORKING_IS_COMPLETE)
|
|
|
|
} // namespace detail
|
|
|
|
/*!
|
|
* \brief The type trait detects whether the type \c T is an iterator type.
|
|
*
|
|
* The type trait yields \c true if its argument type \c T, after stripping top level
|
|
* cv qualifiers, is one of the following:
|
|
*
|
|
* - A pointer type, other than a pointer to function, a pointer to a class member,
|
|
* or a pointer to an incomplete type, including `void`.
|
|
* - A class type for which an iterator category is obtainable. Prior to C++17,
|
|
* the iterator category must be defined as a public `T::iterator_category` type.
|
|
* Since C++17, the expression `std::iterator_traits< T >::iterator_category` must
|
|
* be valid and produce the iterator category type.
|
|
*
|
|
* Otherwise, the type trait yields \c false.
|
|
*/
|
|
template< typename T >
|
|
struct is_iterator : public detail::is_iterator_impl< T >::type {};
|
|
template< typename T >
|
|
struct is_iterator< const T > : public detail::is_iterator_impl< T >::type {};
|
|
template< typename T >
|
|
struct is_iterator< volatile T > : public detail::is_iterator_impl< T >::type {};
|
|
template< typename T >
|
|
struct is_iterator< const volatile T > : public detail::is_iterator_impl< T >::type {};
|
|
|
|
} // namespace iterators
|
|
|
|
using iterators::is_iterator;
|
|
|
|
} // namespace boost
|
|
|
|
#endif // BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|