/* 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