Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
a167a143
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 1 年 前同步成功
通知
2299
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
a167a143
编写于
2月 22, 2022
作者:
C
chentianyu03
提交者:
GitHub
2月 22, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
import llvm::ArrayRef and add test (#39802)
上级
42eb56e2
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
430 addition
and
0 deletion
+430
-0
paddle/testing/CMakeLists.txt
paddle/testing/CMakeLists.txt
+1
-0
paddle/testing/array_ref_test.cc
paddle/testing/array_ref_test.cc
+92
-0
paddle/utils/array_ref.h
paddle/utils/array_ref.h
+337
-0
未找到文件。
paddle/testing/CMakeLists.txt
浏览文件 @
a167a143
...
@@ -4,3 +4,4 @@ if(WITH_TESTING)
...
@@ -4,3 +4,4 @@ if(WITH_TESTING)
cc_library
(
paddle_gtest_main SRCS paddle_gtest_main.cc DEPS init device_context memory gtest gflags
)
cc_library
(
paddle_gtest_main SRCS paddle_gtest_main.cc DEPS init device_context memory gtest gflags
)
endif
()
endif
()
cc_test
(
small_vector_test SRCS small_vector_test.cc DEPS gtest gflags
)
cc_test
(
small_vector_test SRCS small_vector_test.cc DEPS gtest gflags
)
cc_test
(
array_ref_test SRCS array_ref_test.cc DEPS gtest gflags
)
paddle/testing/array_ref_test.cc
0 → 100644
浏览文件 @
a167a143
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "paddle/utils/array_ref.h"
#include <cstdlib>
#include <ctime>
#include "glog/logging.h"
#include "gtest/gtest.h"
TEST
(
array_ref
,
array_ref
)
{
paddle
::
ArrayRef
<
int
>
a
;
CHECK_EQ
(
a
.
size
(),
size_t
(
0
));
CHECK_EQ
(
a
.
data
(),
static_cast
<
int
*>
(
nullptr
));
paddle
::
ArrayRef
<
int
>
b
(
paddle
::
none
);
CHECK_EQ
(
b
.
size
(),
size_t
(
0
));
CHECK_EQ
(
b
.
data
(),
static_cast
<
int
*>
(
nullptr
));
int
v
=
1
;
paddle
::
ArrayRef
<
int
>
c
(
v
);
CHECK_EQ
(
c
.
size
(),
size_t
(
1
));
CHECK_EQ
(
c
.
data
(),
&
v
);
CHECK_EQ
(
c
.
equals
(
paddle
::
makeArrayRef
(
v
)),
true
);
int
v1
[
5
]
=
{
1
,
2
,
3
,
4
,
5
};
paddle
::
ArrayRef
<
int
>
d
(
v1
,
5
);
CHECK_EQ
(
d
.
size
(),
size_t
(
5
));
CHECK_EQ
(
d
.
data
(),
v1
);
CHECK_EQ
(
d
.
equals
(
paddle
::
makeArrayRef
(
v1
,
5
)),
true
);
paddle
::
ArrayRef
<
int
>
e
(
&
v1
[
0
],
&
v1
[
4
]);
CHECK_EQ
(
e
.
size
(),
size_t
(
4
));
CHECK_EQ
(
e
.
data
(),
v1
);
CHECK_EQ
(
e
.
equals
(
paddle
::
makeArrayRef
(
&
v1
[
0
],
&
v1
[
4
])),
true
);
paddle
::
SmallVector
<
int
,
3
>
small_vector
{
1
,
2
,
3
};
paddle
::
ArrayRef
<
int
>
f
(
small_vector
);
CHECK_EQ
(
f
.
size
(),
size_t
(
3
));
CHECK_EQ
(
f
.
data
(),
small_vector
.
data
());
CHECK_EQ
(
f
.
equals
(
paddle
::
makeArrayRef
(
small_vector
)),
true
);
std
::
vector
<
int
>
vector
{
1
,
2
,
3
};
paddle
::
ArrayRef
<
int
>
g
(
vector
);
CHECK_EQ
(
g
.
size
(),
size_t
(
3
));
CHECK_EQ
(
g
.
data
(),
vector
.
data
());
CHECK_EQ
(
g
.
equals
(
paddle
::
makeArrayRef
(
vector
)),
true
);
std
::
initializer_list
<
int
>
list
=
{
1
,
2
,
3
};
paddle
::
ArrayRef
<
int
>
h
(
list
);
CHECK_EQ
(
h
.
size
(),
size_t
(
3
));
CHECK_EQ
(
h
.
data
(),
list
.
begin
());
paddle
::
ArrayRef
<
int
>
i
(
h
);
CHECK_EQ
(
i
.
size
(),
size_t
(
3
));
CHECK_EQ
(
i
.
data
(),
list
.
begin
());
CHECK_EQ
(
i
.
equals
(
h
),
true
);
CHECK_EQ
(
i
.
equals
(
paddle
::
makeArrayRef
(
h
)),
true
);
auto
slice
=
i
.
slice
(
1
,
2
);
CHECK_EQ
(
slice
.
size
(),
size_t
(
2
));
CHECK_EQ
(
slice
[
0
],
2
);
CHECK_EQ
(
slice
[
1
],
3
);
auto
drop
=
i
.
drop_front
(
2
);
CHECK_EQ
(
drop
.
size
(),
size_t
(
1
));
CHECK_EQ
(
drop
[
0
],
3
);
paddle
::
ArrayRef
<
int
>
nums
=
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
};
auto
front
=
nums
.
take_front
(
3
);
CHECK_EQ
(
front
.
size
(),
size_t
(
3
));
for
(
size_t
i
=
0
;
i
<
3
;
++
i
)
{
CHECK_EQ
(
front
[
i
],
nums
[
i
]);
}
auto
back
=
nums
.
take_back
(
3
);
CHECK_EQ
(
back
.
size
(),
size_t
(
3
));
for
(
size_t
i
=
0
;
i
<
3
;
++
i
)
{
CHECK_EQ
(
back
[
i
],
nums
[
i
+
5
]);
}
}
paddle/utils/array_ref.h
0 → 100644
浏览文件 @
a167a143
// This file copy from llvm/ADT/ArrayRef.h, version: 12.0.0
// Modified the following points
// 1. remove hash_value functions
// 2. replace with the llvm::NoneType with paddle::none_t
// 3. remove drop_while, drop_until, take_while, take_until methods
//===- ArrayRef.h - Array Reference Wrapper ---------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef PADDLE_UTILS_ARRAY_REF_H_
#define PADDLE_UTILS_ARRAY_REF_H_
#include <algorithm>
#include <array>
#include <cassert>
#include <cstddef>
#include <initializer_list>
#include <iterator>
#include <memory>
#include <type_traits>
#include <vector>
#include "paddle/utils/none.h"
#include "paddle/utils/small_vector.h"
namespace
paddle
{
/// ArrayRef - Represent a constant reference to an array (0 or more elements
/// consecutively in memory), i.e. a start pointer and a length. It allows
/// various APIs to take consecutive elements easily and conveniently.
///
/// This class does not own the underlying data, it is expected to be used in
/// situations where the data resides in some other buffer, whose lifetime
/// extends past that of the ArrayRef. For this reason, it is not in general
/// safe to store an ArrayRef.
///
/// This is intended to be trivially copyable, so it should be passed by
/// value.
template
<
typename
T
>
class
ArrayRef
{
public:
using
iterator
=
const
T
*
;
using
const_iterator
=
const
T
*
;
using
size_type
=
size_t
;
using
reverse_iterator
=
std
::
reverse_iterator
<
iterator
>
;
private:
/// The start of the array, in an external buffer.
const
T
*
Data
=
nullptr
;
/// The number of elements.
size_type
Length
=
0
;
public:
/// @name Constructors
/// @{
/// Construct an empty ArrayRef.
/*implicit*/
ArrayRef
()
=
default
;
/// Construct an empty ArrayRef from None.
/*implicit*/
ArrayRef
(
none_t
)
{}
/// Construct an ArrayRef from a single element.
/*implicit*/
ArrayRef
(
const
T
&
OneElt
)
:
Data
(
&
OneElt
),
Length
(
1
)
{}
/// Construct an ArrayRef from a pointer and length.
/*implicit*/
ArrayRef
(
const
T
*
data
,
size_t
length
)
:
Data
(
data
),
Length
(
length
)
{}
/// Construct an ArrayRef from a range.
ArrayRef
(
const
T
*
begin
,
const
T
*
end
)
:
Data
(
begin
),
Length
(
end
-
begin
)
{}
/// Construct an ArrayRef from a SmallVector. This is templated in order to
/// avoid instantiating SmallVectorTemplateCommon<T> whenever we
/// copy-construct an ArrayRef.
template
<
typename
U
>
/*implicit*/
ArrayRef
(
const
SmallVectorTemplateCommon
<
T
,
U
>
&
Vec
)
:
Data
(
Vec
.
data
()),
Length
(
Vec
.
size
())
{}
/// Construct an ArrayRef from a std::vector.
template
<
typename
A
>
/*implicit*/
ArrayRef
(
const
std
::
vector
<
T
,
A
>
&
Vec
)
:
Data
(
Vec
.
data
()),
Length
(
Vec
.
size
())
{}
/// Construct an ArrayRef from a std::array
template
<
size_t
N
>
/*implicit*/
constexpr
ArrayRef
(
const
std
::
array
<
T
,
N
>
&
Arr
)
:
Data
(
Arr
.
data
()),
Length
(
N
)
{}
/// Construct an ArrayRef from a C array.
template
<
size_t
N
>
/*implicit*/
constexpr
ArrayRef
(
const
T
(
&
Arr
)[
N
])
:
Data
(
Arr
),
Length
(
N
)
{}
/// Construct an ArrayRef from a std::initializer_list.
/*implicit*/
ArrayRef
(
const
std
::
initializer_list
<
T
>
&
Vec
)
:
Data
(
Vec
.
begin
()
==
Vec
.
end
()
?
(
T
*
)
nullptr
:
Vec
.
begin
()),
Length
(
Vec
.
size
())
{}
/// Construct an ArrayRef<const T*> from ArrayRef<T*>. This uses SFINAE to
/// ensure that only ArrayRefs of pointers can be converted.
template
<
typename
U
>
ArrayRef
(
const
ArrayRef
<
U
*>
&
A
,
std
::
enable_if_t
<
std
::
is_convertible
<
U
*
const
*
,
T
const
*>::
value
>
*
=
nullptr
)
:
Data
(
A
.
data
()),
Length
(
A
.
size
())
{}
/// Construct an ArrayRef<const T*> from a SmallVector<T*>. This is
/// templated in order to avoid instantiating SmallVectorTemplateCommon<T>
/// whenever we copy-construct an ArrayRef.
template
<
typename
U
,
typename
DummyT
>
/*implicit*/
ArrayRef
(
const
SmallVectorTemplateCommon
<
U
*
,
DummyT
>
&
Vec
,
std
::
enable_if_t
<
std
::
is_convertible
<
U
*
const
*
,
T
const
*>::
value
>
*
=
nullptr
)
:
Data
(
Vec
.
data
()),
Length
(
Vec
.
size
())
{}
/// Construct an ArrayRef<const T*> from std::vector<T*>. This uses SFINAE
/// to ensure that only vectors of pointers can be converted.
template
<
typename
U
,
typename
A
>
ArrayRef
(
const
std
::
vector
<
U
*
,
A
>
&
Vec
,
std
::
enable_if_t
<
std
::
is_convertible
<
U
*
const
*
,
T
const
*>::
value
>
*
=
0
)
:
Data
(
Vec
.
data
()),
Length
(
Vec
.
size
())
{}
/// @}
/// @name Simple Operations
/// @{
iterator
begin
()
const
{
return
Data
;
}
iterator
end
()
const
{
return
Data
+
Length
;
}
reverse_iterator
rbegin
()
const
{
return
reverse_iterator
(
end
());
}
reverse_iterator
rend
()
const
{
return
reverse_iterator
(
begin
());
}
/// empty - Check if the array is empty.
bool
empty
()
const
{
return
Length
==
0
;
}
const
T
*
data
()
const
{
return
Data
;
}
/// size - Get the array size.
size_t
size
()
const
{
return
Length
;
}
/// front - Get the first element.
const
T
&
front
()
const
{
assert
(
!
empty
());
return
Data
[
0
];
}
/// back - Get the last element.
const
T
&
back
()
const
{
assert
(
!
empty
());
return
Data
[
Length
-
1
];
}
// copy - Allocate copy in Allocator and return ArrayRef<T> to it.
template
<
typename
Allocator
>
ArrayRef
<
T
>
copy
(
Allocator
&
A
)
{
T
*
Buff
=
A
.
template
Allocate
<
T
>(
Length
);
std
::
uninitialized_copy
(
begin
(),
end
(),
Buff
);
return
ArrayRef
<
T
>
(
Buff
,
Length
);
}
/// equals - Check for element-wise equality.
bool
equals
(
ArrayRef
RHS
)
const
{
if
(
Length
!=
RHS
.
Length
)
return
false
;
return
std
::
equal
(
begin
(),
end
(),
RHS
.
begin
());
}
/// slice(n, m) - Chop off the first N elements of the array, and keep M
/// elements in the array.
ArrayRef
<
T
>
slice
(
size_t
N
,
size_t
M
)
const
{
assert
(
N
+
M
<=
size
()
&&
"Invalid specifier"
);
return
ArrayRef
<
T
>
(
data
()
+
N
,
M
);
}
/// slice(n) - Chop off the first N elements of the array.
ArrayRef
<
T
>
slice
(
size_t
N
)
const
{
return
slice
(
N
,
size
()
-
N
);
}
/// Drop the first \p N elements of the array.
ArrayRef
<
T
>
drop_front
(
size_t
N
=
1
)
const
{
assert
(
size
()
>=
N
&&
"Dropping more elements than exist"
);
return
slice
(
N
,
size
()
-
N
);
}
/// Drop the last \p N elements of the array.
ArrayRef
<
T
>
drop_back
(
size_t
N
=
1
)
const
{
assert
(
size
()
>=
N
&&
"Dropping more elements than exist"
);
return
slice
(
0
,
size
()
-
N
);
}
/// Return a copy of *this with only the first \p N elements.
ArrayRef
<
T
>
take_front
(
size_t
N
=
1
)
const
{
if
(
N
>=
size
())
return
*
this
;
return
drop_back
(
size
()
-
N
);
}
/// Return a copy of *this with only the last \p N elements.
ArrayRef
<
T
>
take_back
(
size_t
N
=
1
)
const
{
if
(
N
>=
size
())
return
*
this
;
return
drop_front
(
size
()
-
N
);
}
/// @}
/// @name Operator Overloads
/// @{
const
T
&
operator
[](
size_t
Index
)
const
{
assert
(
Index
<
Length
&&
"Invalid index!"
);
return
Data
[
Index
];
}
/// Disallow accidental assignment from a temporary.
///
/// The declaration here is extra complicated so that "arrayRef = {}"
/// continues to select the move assignment operator.
template
<
typename
U
>
std
::
enable_if_t
<
std
::
is_same
<
U
,
T
>::
value
,
ArrayRef
<
T
>>
&
operator
=
(
U
&&
Temporary
)
=
delete
;
/// Disallow accidental assignment from a temporary.
///
/// The declaration here is extra complicated so that "arrayRef = {}"
/// continues to select the move assignment operator.
template
<
typename
U
>
std
::
enable_if_t
<
std
::
is_same
<
U
,
T
>::
value
,
ArrayRef
<
T
>>
&
operator
=
(
std
::
initializer_list
<
U
>
)
=
delete
;
/// @}
/// @name Expensive Operations
/// @{
std
::
vector
<
T
>
vec
()
const
{
return
std
::
vector
<
T
>
(
Data
,
Data
+
Length
);
}
/// @}
/// @name Conversion operators
/// @{
operator
std
::
vector
<
T
>
()
const
{
return
std
::
vector
<
T
>
(
Data
,
Data
+
Length
);
}
/// @}
};
/// @name ArrayRef Convenience constructors
/// @{
/// Construct an ArrayRef from a single element.
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
T
&
OneElt
)
{
return
OneElt
;
}
/// Construct an ArrayRef from a pointer and length.
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
T
*
data
,
size_t
length
)
{
return
ArrayRef
<
T
>
(
data
,
length
);
}
/// Construct an ArrayRef from a range.
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
T
*
begin
,
const
T
*
end
)
{
return
ArrayRef
<
T
>
(
begin
,
end
);
}
/// Construct an ArrayRef from a SmallVector.
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
SmallVectorImpl
<
T
>
&
Vec
)
{
return
Vec
;
}
/// Construct an ArrayRef from a SmallVector.
template
<
typename
T
,
unsigned
N
>
ArrayRef
<
T
>
makeArrayRef
(
const
SmallVector
<
T
,
N
>
&
Vec
)
{
return
Vec
;
}
/// Construct an ArrayRef from a std::vector.
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
std
::
vector
<
T
>
&
Vec
)
{
return
Vec
;
}
/// Construct an ArrayRef from a std::array.
template
<
typename
T
,
std
::
size_t
N
>
ArrayRef
<
T
>
makeArrayRef
(
const
std
::
array
<
T
,
N
>
&
Arr
)
{
return
Arr
;
}
/// Construct an ArrayRef from an ArrayRef (no-op) (const)
template
<
typename
T
>
ArrayRef
<
T
>
makeArrayRef
(
const
ArrayRef
<
T
>
&
Vec
)
{
return
Vec
;
}
/// Construct an ArrayRef from an ArrayRef (no-op)
template
<
typename
T
>
ArrayRef
<
T
>
&
makeArrayRef
(
ArrayRef
<
T
>
&
Vec
)
{
return
Vec
;
}
/// Construct an ArrayRef from a C array.
template
<
typename
T
,
size_t
N
>
ArrayRef
<
T
>
makeArrayRef
(
const
T
(
&
Arr
)[
N
])
{
return
ArrayRef
<
T
>
(
Arr
);
}
/// @}
/// @name ArrayRef Comparison Operators
/// @{
template
<
typename
T
>
inline
bool
operator
==
(
ArrayRef
<
T
>
LHS
,
ArrayRef
<
T
>
RHS
)
{
return
LHS
.
equals
(
RHS
);
}
template
<
typename
T
>
inline
bool
operator
==
(
SmallVectorImpl
<
T
>
&
LHS
,
ArrayRef
<
T
>
RHS
)
{
return
ArrayRef
<
T
>
(
LHS
).
equals
(
RHS
);
}
template
<
typename
T
>
inline
bool
operator
!=
(
ArrayRef
<
T
>
LHS
,
ArrayRef
<
T
>
RHS
)
{
return
!
(
LHS
==
RHS
);
}
template
<
typename
T
>
inline
bool
operator
!=
(
SmallVectorImpl
<
T
>
&
LHS
,
ArrayRef
<
T
>
RHS
)
{
return
!
(
LHS
==
RHS
);
}
}
// end namespace paddle
#endif // PADDLE_UTILS_ARRAY_REF_H_
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录