1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* 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 <iterator>
#include <type_traits>
namespace boost{
namespace poly_collection{
namespace detail{
/* (Internal) bunch of traits-grouped functions for const-preserving
* interoperatibility between iterators and local iterators of a
* poly_collection.
*/
template<typename Iterator>
struct poly_collection_of /* to be specialized for iterator impls */
{
using type=void;
};
namespace poly_collection_impl{
template<typename Model,typename Allocator>
class poly_collection;
}
template<typename PolyCollection>
struct model_of;
template<typename Model,typename Allocator>
struct model_of<poly_collection_impl::poly_collection<Model,Allocator>>
{
using type=Model;
};
template<typename Iterator>
struct iterator_traits
{
using container_type=typename poly_collection_of<Iterator>::type;
using is_const_iterator=typename std::is_const<
typename std::remove_reference<
typename std::iterator_traits<Iterator>::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<typename T>
using local_iterator=typename std::conditional<
is_const_iterator::value,
typename container_type::template const_local_iterator<T>,
typename container_type::template local_iterator<T>
>::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<container_type>::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
|