Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
a167a143
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录