]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/poly_collection/detail/iterator_traits.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / poly_collection / detail / iterator_traits.hpp
1 /* Copyright 2016-2017 Joaquin M Lopez Munoz.
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
5 *
6 * See http://www.boost.org/libs/poly_collection for library home page.
7 */
8
9 #ifndef BOOST_POLY_COLLECTION_DETAIL_ITERATOR_TRAITS_HPP
10 #define BOOST_POLY_COLLECTION_DETAIL_ITERATOR_TRAITS_HPP
11
12 #if defined(_MSC_VER)
13 #pragma once
14 #endif
15
16 #include <iterator>
17 #include <type_traits>
18
19 namespace boost{
20
21 namespace poly_collection{
22
23 namespace common_impl{
24
25 template<typename Model,typename Allocator>
26 class poly_collection;
27
28 }
29
30 namespace detail{
31
32 /* (Internal) bunch of traits-grouped functions for const-preserving
33 * interoperatibility between iterators and local iterators of a
34 * poly_collection.
35 */
36
37 template<typename Iterator>
38 struct poly_collection_of /* to be specialized for iterator impls */
39 {
40 using type=void;
41 };
42
43 template<typename PolyCollection>
44 struct model_of;
45
46 template<typename Model,typename Allocator>
47 struct model_of<common_impl::poly_collection<Model,Allocator>>
48 {
49 using type=Model;
50 };
51
52 template<typename Iterator>
53 struct iterator_traits
54 {
55 using container_type=typename poly_collection_of<Iterator>::type;
56 using is_const_iterator=typename std::is_const<
57 typename std::remove_reference<
58 typename std::iterator_traits<Iterator>::reference
59 >::type
60 >::type;
61 using iterator=typename std::conditional<
62 is_const_iterator::value,
63 typename container_type::const_iterator,
64 typename container_type::iterator
65 >::type;
66 using base_segment_info_iterator=typename std::conditional<
67 is_const_iterator::value,
68 typename container_type::const_base_segment_info_iterator,
69 typename container_type::base_segment_info_iterator
70 >::type;
71 using local_base_iterator=typename std::conditional<
72 is_const_iterator::value,
73 typename container_type::const_local_base_iterator,
74 typename container_type::local_base_iterator
75 >::type;
76 template<typename T>
77 using local_iterator=typename std::conditional<
78 is_const_iterator::value,
79 typename container_type::template const_local_iterator<T>,
80 typename container_type::template local_iterator<T>
81 >::type;
82
83 static base_segment_info_iterator
84 base_segment_info_iterator_from(iterator it)noexcept{return it.mapit;}
85
86 static base_segment_info_iterator
87 base_segment_info_iterator_from(local_base_iterator it)noexcept
88 {return it.mapit;}
89
90 static base_segment_info_iterator
91 end_base_segment_info_iterator_from(iterator it)noexcept{return it.mapend;}
92
93 static local_base_iterator
94 local_base_iterator_from(iterator it)noexcept
95 {
96 return {
97 it.mapit,
98 model_of<container_type>::type::nonconst_iterator(it.segpos)
99 };
100 }
101
102 static iterator
103 iterator_from(
104 local_base_iterator lbit,base_segment_info_iterator mapend)noexcept
105 {
106 return {lbit.mapit,mapend.base(),lbit.base()};
107 }
108 };
109
110 } /* namespace poly_collection::detail */
111
112 } /* namespace poly_collection */
113
114 } /* namespace boost */
115
116 #endif