/usr/include/boost/poly_collection/detail
Edit: /usr/include/boost/poly_collection/detail/iterator_traits.hpp (3056B)
/* Copyright 2016-2017 Joaquin M Lopez Munoz.
* Distributed under 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)
*
* See http://www.boost.org/libs/poly_collection for library home page.
*/
#ifndef BOOST_POLY_COLLECTION_DETAIL_ITERATOR_TRAITS_HPP
#define BOOST_POLY_COLLECTION_DETAIL_ITERATOR_TRAITS_HPP
#if defined(_MSC_VER)
#pragma once
#endif
#include
#include
namespace boost{
namespace poly_collection{
namespace common_impl{
template
class poly_collection;
}
namespace detail{
/* (Internal) bunch of traits-grouped functions for const-preserving
* interoperatibility between iterators and local iterators of a
* poly_collection.
*/
template
struct poly_collection_of /* to be specialized for iterator impls */
{
using type=void;
};
template
struct model_of;
template
struct model_of>
{
using type=Model;
};
template
struct iterator_traits
{
using container_type=typename poly_collection_of::type;
using is_const_iterator=typename std::is_const<
typename std::remove_reference<
typename std::iterator_traits::reference
>::type
>::type;
using iterator=typename std::conditional<
is_const_iterator::value,
typename container_type::const_iterator,
typename container_type::iterator
>::type;
using base_segment_info_iterator=typename std::conditional<
is_const_iterator::value,
typename container_type::const_base_segment_info_iterator,
typename container_type::base_segment_info_iterator
>::type;
using local_base_iterator=typename std::conditional<
is_const_iterator::value,
typename container_type::const_local_base_iterator,
typename container_type::local_base_iterator
>::type;
template
using local_iterator=typename std::conditional<
is_const_iterator::value,
typename container_type::template const_local_iterator,
typename container_type::template local_iterator
>::type;
static base_segment_info_iterator
base_segment_info_iterator_from(iterator it)noexcept{return it.mapit;}
static base_segment_info_iterator
base_segment_info_iterator_from(local_base_iterator it)noexcept
{return it.mapit;}
static base_segment_info_iterator
end_base_segment_info_iterator_from(iterator it)noexcept{return it.mapend;}
static local_base_iterator
local_base_iterator_from(iterator it)noexcept
{
return {
it.mapit,
model_of::type::nonconst_iterator(it.segpos)
};
}
static iterator
iterator_from(
local_base_iterator lbit,base_segment_info_iterator mapend)noexcept
{
return {lbit.mapit,mapend.base(),lbit.base()};
}
};
} /* namespace poly_collection::detail */
} /* namespace poly_collection */
} /* namespace boost */
#endif