Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
ea9c8dca
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ea9c8dca
编写于
6月 13, 2017
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Removed useless code [#CLICKHOUSE-31].
上级
2af2ddfc
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
27 addition
and
71 deletion
+27
-71
libs/libcommon/include/ext/map.h
libs/libcommon/include/ext/map.h
+19
-52
libs/libcommon/include/ext/range.h
libs/libcommon/include/ext/range.h
+8
-19
未找到文件。
libs/libcommon/include/ext/map.h
浏览文件 @
ea9c8dca
#pragma once
#include <iterator>
#include <type_traits>
#include <boost/iterator/transform_iterator.hpp>
namespace
ext
{
...
...
@@ -9,76 +10,42 @@ namespace ext
template
<
typename
T
>
using
unqualified_t
=
std
::
remove_cv_t
<
std
::
remove_reference_t
<
T
>>
;
template
<
typename
It
,
typename
Mapper
>
using
apply_t
=
typename
std
::
result_of
<
Mapper
(
typename
It
::
reference
)
>::
type
;
template
<
typename
It
,
typename
Mapper
>
struct
map_iterator
:
std
::
iterator
<
typename
It
::
iterator_category
,
std
::
remove_reference_t
<
apply_t
<
It
,
Mapper
>>
,
std
::
ptrdiff_t
,
std
::
add_pointer_t
<
std
::
remove_reference_t
<
apply_t
<
It
,
Mapper
>>>
,
apply_t
<
It
,
Mapper
>>
{
using
base_iterator
=
std
::
iterator
<
typename
It
::
iterator_category
,
std
::
remove_reference_t
<
apply_t
<
It
,
Mapper
>>
,
std
::
ptrdiff_t
,
std
::
add_pointer
<
std
::
remove_reference_t
<
apply_t
<
It
,
Mapper
>>>
,
apply_t
<
It
,
Mapper
>>
;
It
current
;
Mapper
mapper
;
map_iterator
(
const
It
it
,
const
Mapper
mapper
)
:
current
{
it
},
mapper
{
mapper
}
{}
typename
base_iterator
::
reference
operator
*
()
{
return
mapper
(
*
current
);
}
map_iterator
&
operator
++
()
{
return
++
current
,
*
this
;
}
map_iterator
&
operator
--
()
{
return
--
current
,
*
this
;
}
bool
operator
==
(
const
map_iterator
&
other
)
{
return
current
==
other
.
current
;
}
bool
operator
!=
(
const
map_iterator
&
other
)
{
return
current
!=
other
.
current
;
}
typename
base_iterator
::
difference_type
operator
-
(
const
map_iterator
&
other
)
{
return
current
-
other
.
current
;
}
};
template
<
typename
It
,
typename
Mapper
>
auto
make_map_iterator
(
const
It
it
,
const
Mapper
mapper
)
->
ext
::
map_iterator
<
It
,
Mapper
>
{
return
{
it
,
mapper
};
}
/** \brief Returns collection of the same container-type as the input collection,
* with each element transformed by the application of `mapper`. */
* with each element transformed by the application of `mapper`.
*/
template
<
template
<
typename
...
>
class
Collection
,
typename
...
Params
,
typename
Mapper
>
auto
map
(
const
Collection
<
Params
...
>
&
collection
,
const
Mapper
mapper
)
{
using
value_type
=
unqualified_t
<
decltype
(
mapper
(
*
std
::
begin
(
collection
)))
>
;
return
Collection
<
value_type
>
(
ext
::
make_map_iterator
(
std
::
begin
(
collection
),
mapper
),
ext
::
make_map_iterator
(
std
::
end
(
collection
),
mapper
));
return
Collection
<
value_type
>
(
boost
::
make_transform_iterator
(
std
::
begin
(
collection
),
mapper
),
boost
::
make_transform_iterator
(
std
::
end
(
collection
),
mapper
));
};
/** \brief Returns collection of specified container-type,
* with each element transformed by the application of `mapper`.
* Allows conversion between different container-types, e.g. std::vector to std::list */
* with each element transformed by the application of `mapper`.
* Allows conversion between different container-types, e.g. std::vector to std::list
*/
template
<
template
<
typename
...
>
class
ResultCollection
,
typename
Collection
,
typename
Mapper
>
auto
map
(
const
Collection
&
collection
,
const
Mapper
mapper
)
{
using
value_type
=
unqualified_t
<
decltype
(
mapper
(
*
std
::
begin
(
collection
)))
>
;
return
ResultCollection
<
value_type
>
(
ext
::
make_map_iterator
(
std
::
begin
(
collection
),
mapper
),
ext
::
make_map_iterator
(
std
::
end
(
collection
),
mapper
));
return
ResultCollection
<
value_type
>
(
boost
::
make_transform_iterator
(
std
::
begin
(
collection
),
mapper
),
boost
::
make_transform_iterator
(
std
::
end
(
collection
),
mapper
));
};
/** \brief Returns collection of specified type,
* with each element transformed by the application of `mapper`.
* Allows leveraging implicit conversion between the result of applying `mapper` and R::value_type. */
* with each element transformed by the application of `mapper`.
* Allows leveraging implicit conversion between the result of applying `mapper` and R::value_type.
*/
template
<
typename
ResultCollection
,
typename
Collection
,
typename
Mapper
>
auto
map
(
const
Collection
&
collection
,
const
Mapper
mapper
)
{
return
ResultCollection
(
ext
::
make_map_iterator
(
std
::
begin
(
collection
),
mapper
),
ext
::
make_map_iterator
(
std
::
end
(
collection
),
mapper
));
return
ResultCollection
(
boost
::
make_transform_iterator
(
std
::
begin
(
collection
),
mapper
),
boost
::
make_transform_iterator
(
std
::
end
(
collection
),
mapper
));
}
}
libs/libcommon/include/ext/range.h
浏览文件 @
ea9c8dca
...
...
@@ -3,35 +3,24 @@
#include <type_traits>
#include <utility>
#include <iterator>
#include <boost/iterator/counting_iterator.hpp>
/** \brief Numeric range iterator, used to represent a half-closed interval [begin, end).
* In conjunction with std::reverse_iterator allows for forward and backward iteration
* over corresponding interval. */
namespace
ext
{
/// @todo check whether difference_type should be signed (make_signed_t<T>)
template
<
typename
T
>
struct
range_iterator
:
std
::
iterator
<
std
::
bidirectional_iterator_tag
,
T
,
T
,
void
,
T
>
{
T
current
{};
range_iterator
()
=
default
;
range_iterator
(
const
T
t
)
:
current
(
t
)
{}
T
operator
*
()
const
{
return
current
;
}
range_iterator
&
operator
++
()
{
return
++
current
,
*
this
;
}
range_iterator
&
operator
--
()
{
return
--
current
,
*
this
;
}
bool
operator
==
(
const
range_iterator
&
other
)
const
{
return
current
==
other
.
current
;
}
bool
operator
!=
(
const
range_iterator
&
other
)
const
{
return
current
!=
other
.
current
;
}
};
template
<
typename
T
>
using
range_iterator
=
boost
::
counting_iterator
<
T
>
;
template
<
typename
T
>
using
reverse_range_iterator
=
std
::
reverse_iterator
<
range_iterator
<
T
>>
;
template
<
typename
T
>
using
reverse_range_iterator
=
std
::
reverse_iterator
<
range_iterator
<
T
>>
;
/** \brief Range-based for loop adapter for (reverse_)range_iterator.
* By and large should be in conjunction with ext::range and ext::reverse_range. */
template
<
typename
T
,
bool
forward
>
struct
range_wrapper
template
<
typename
T
,
bool
forward
>
struct
range_wrapper
{
using
value_type
=
typename
std
::
remove_reference
<
T
>::
type
;
using
range_iterator_t
=
ext
::
range_iterator
<
value_type
>
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录