Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
ea1d3acf
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 1 年 前同步成功
通知
2298
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看板
提交
ea1d3acf
编写于
6月 28, 2017
作者:
Y
Yi Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename string/stringpiece* into string/piece
上级
6215f47c
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
225 addition
and
83 deletion
+225
-83
paddle/CMakeLists.txt
paddle/CMakeLists.txt
+1
-1
paddle/string/CMakeLists.txt
paddle/string/CMakeLists.txt
+2
-2
paddle/string/piece.cc
paddle/string/piece.cc
+138
-0
paddle/string/piece.h
paddle/string/piece.h
+33
-31
paddle/string/piece_test.cc
paddle/string/piece_test.cc
+51
-49
未找到文件。
paddle/CMakeLists.txt
浏览文件 @
ea1d3acf
...
...
@@ -9,7 +9,7 @@ add_subdirectory(pserver)
add_subdirectory
(
trainer
)
add_subdirectory
(
scripts
)
add_subdirectory
(
optimizer
)
add_subdirectory
(
string
s
)
add_subdirectory
(
string
)
if
(
Boost_FOUND
)
add_subdirectory
(
memory
)
...
...
paddle/string/CMakeLists.txt
浏览文件 @
ea1d3acf
cc_library
(
stringpiece SRCS
string
piece.cc
)
cc_test
(
stringpiece_test SRCS
string
piece_test.cc DEPS stringpiece glog gflags
)
cc_library
(
stringpiece SRCS piece.cc
)
cc_test
(
stringpiece_test SRCS piece_test.cc DEPS stringpiece glog gflags
)
paddle/string/
string
piece.cc
→
paddle/string/piece.cc
浏览文件 @
ea1d3acf
...
...
@@ -14,7 +14,7 @@
limitations under the License.
*/
#include "paddle/string
s/string
piece.h"
#include "paddle/string
/
piece.h"
#include <string.h>
...
...
@@ -23,29 +23,25 @@
#include <stdexcept>
namespace
paddle
{
namespace
string
{
StringPiece
::
String
Piece
()
:
data_
(
NULL
),
size_
(
0
)
{}
Piece
::
Piece
()
:
data_
(
NULL
),
size_
(
0
)
{}
StringPiece
::
String
Piece
(
const
char
*
d
,
size_t
n
)
:
data_
(
d
),
size_
(
n
)
{
Piece
::
Piece
(
const
char
*
d
,
size_t
n
)
:
data_
(
d
),
size_
(
n
)
{
if
(
d
==
NULL
&&
n
!=
0
)
throw
std
::
invalid_argument
(
"StringPiece requires len to be 0 for NULL data"
);
throw
std
::
invalid_argument
(
"Piece requires len to be 0 for NULL data"
);
}
StringPiece
::
StringPiece
(
const
char
*
s
)
:
data_
(
s
)
{
size_
=
(
s
==
NULL
)
?
0
:
strlen
(
s
);
}
Piece
::
Piece
(
const
char
*
s
)
:
data_
(
s
)
{
size_
=
(
s
==
NULL
)
?
0
:
strlen
(
s
);
}
StringPiece
::
StringPiece
(
const
std
::
string
&
s
)
:
data_
(
s
.
data
()),
size_
(
s
.
size
())
{}
Piece
::
Piece
(
const
std
::
string
&
s
)
:
data_
(
s
.
data
()),
size_
(
s
.
size
())
{}
char
StringPiece
::
operator
[](
size_t
n
)
const
{
if
(
n
>=
len
())
throw
std
::
invalid_argument
(
"index out of StringPiece length"
);
char
Piece
::
operator
[](
size_t
n
)
const
{
if
(
n
>=
len
())
throw
std
::
invalid_argument
(
"index out of Piece length"
);
return
data_
[
n
];
}
int
Compare
(
StringPiece
a
,
String
Piece
b
)
{
int
Compare
(
Piece
a
,
Piece
b
)
{
const
size_t
min_len
=
(
a
.
len
()
<
b
.
len
())
?
a
.
len
()
:
b
.
len
();
int
r
=
memcmp
(
a
.
data
(),
b
.
data
(),
min_len
);
if
(
r
==
0
)
{
...
...
@@ -57,85 +53,86 @@ int Compare(StringPiece a, StringPiece b) {
return
r
;
}
bool
operator
==
(
StringPiece
x
,
String
Piece
y
)
{
bool
operator
==
(
Piece
x
,
Piece
y
)
{
return
((
x
.
len
()
==
y
.
len
())
&&
(
x
.
data
()
==
y
.
data
()
||
memcmp
(
x
.
data
(),
y
.
data
(),
x
.
len
())
==
0
));
}
bool
operator
!=
(
StringPiece
x
,
String
Piece
y
)
{
return
!
(
x
==
y
);
}
bool
operator
!=
(
Piece
x
,
Piece
y
)
{
return
!
(
x
==
y
);
}
bool
operator
<
(
StringPiece
x
,
String
Piece
y
)
{
return
Compare
(
x
,
y
)
<
0
;
}
bool
operator
>
(
StringPiece
x
,
String
Piece
y
)
{
return
Compare
(
x
,
y
)
>
0
;
}
bool
operator
<
(
Piece
x
,
Piece
y
)
{
return
Compare
(
x
,
y
)
<
0
;
}
bool
operator
>
(
Piece
x
,
Piece
y
)
{
return
Compare
(
x
,
y
)
>
0
;
}
bool
operator
<=
(
StringPiece
x
,
String
Piece
y
)
{
return
Compare
(
x
,
y
)
<=
0
;
}
bool
operator
>=
(
StringPiece
x
,
String
Piece
y
)
{
return
Compare
(
x
,
y
)
>=
0
;
}
bool
operator
<=
(
Piece
x
,
Piece
y
)
{
return
Compare
(
x
,
y
)
<=
0
;
}
bool
operator
>=
(
Piece
x
,
Piece
y
)
{
return
Compare
(
x
,
y
)
>=
0
;
}
bool
HasPrefix
(
StringPiece
s
,
String
Piece
x
)
{
bool
HasPrefix
(
Piece
s
,
Piece
x
)
{
return
((
s
.
len
()
>=
x
.
len
())
&&
(
memcmp
(
s
.
data
(),
x
.
data
(),
x
.
len
())
==
0
));
}
bool
HasSuffix
(
StringPiece
s
,
String
Piece
x
)
{
bool
HasSuffix
(
Piece
s
,
Piece
x
)
{
return
((
s
.
len
()
>=
x
.
len
())
&&
(
memcmp
(
s
.
data
()
+
(
s
.
len
()
-
x
.
len
()),
x
.
data
(),
x
.
len
())
==
0
));
}
StringPiece
SkipPrefix
(
String
Piece
s
,
size_t
n
)
{
Piece
SkipPrefix
(
Piece
s
,
size_t
n
)
{
if
(
n
>
s
.
len
())
throw
std
::
invalid_argument
(
"Skip distance larger than
String
Piece length"
);
return
String
Piece
(
s
.
data
()
+
n
,
s
.
len
()
-
n
);
throw
std
::
invalid_argument
(
"Skip distance larger than Piece length"
);
return
Piece
(
s
.
data
()
+
n
,
s
.
len
()
-
n
);
}
StringPiece
SkipSuffix
(
String
Piece
s
,
size_t
n
)
{
Piece
SkipSuffix
(
Piece
s
,
size_t
n
)
{
if
(
n
>
s
.
len
())
throw
std
::
invalid_argument
(
"Skip distance larger than
String
Piece length"
);
return
String
Piece
(
s
.
data
(),
s
.
len
()
-
n
);
throw
std
::
invalid_argument
(
"Skip distance larger than Piece length"
);
return
Piece
(
s
.
data
(),
s
.
len
()
-
n
);
}
StringPiece
TrimPrefix
(
StringPiece
s
,
String
Piece
x
)
{
Piece
TrimPrefix
(
Piece
s
,
Piece
x
)
{
return
HasPrefix
(
s
,
x
)
?
SkipPrefix
(
s
,
x
.
len
())
:
s
;
}
StringPiece
TrimSuffix
(
StringPiece
s
,
String
Piece
x
)
{
Piece
TrimSuffix
(
Piece
s
,
Piece
x
)
{
return
HasSuffix
(
s
,
x
)
?
SkipSuffix
(
s
,
x
.
len
())
:
s
;
}
bool
Contains
(
StringPiece
s
,
String
Piece
sub
)
{
bool
Contains
(
Piece
s
,
Piece
sub
)
{
return
std
::
search
(
s
.
begin
(),
s
.
end
(),
sub
.
begin
(),
sub
.
end
())
!=
s
.
end
();
}
size_t
Index
(
StringPiece
s
,
String
Piece
sub
)
{
size_t
Index
(
Piece
s
,
Piece
sub
)
{
auto
e
=
std
::
search
(
s
.
begin
(),
s
.
end
(),
sub
.
begin
(),
sub
.
end
());
return
e
!=
s
.
end
()
?
e
-
s
.
data
()
:
String
Piece
::
npos
;
return
e
!=
s
.
end
()
?
e
-
s
.
data
()
:
Piece
::
npos
;
}
size_t
Find
(
String
Piece
s
,
char
c
,
size_t
pos
)
{
size_t
Find
(
Piece
s
,
char
c
,
size_t
pos
)
{
if
(
pos
>=
s
.
len
())
{
return
String
Piece
::
npos
;
return
Piece
::
npos
;
}
const
char
*
result
=
reinterpret_cast
<
const
char
*>
(
memchr
(
s
.
data
()
+
pos
,
c
,
s
.
len
()
-
pos
));
return
result
!=
nullptr
?
result
-
s
.
data
()
:
String
Piece
::
npos
;
return
result
!=
nullptr
?
result
-
s
.
data
()
:
Piece
::
npos
;
}
size_t
RFind
(
String
Piece
s
,
char
c
,
size_t
pos
)
{
if
(
s
.
len
()
==
0
)
return
String
Piece
::
npos
;
size_t
RFind
(
Piece
s
,
char
c
,
size_t
pos
)
{
if
(
s
.
len
()
==
0
)
return
Piece
::
npos
;
for
(
const
char
*
p
=
s
.
data
()
+
std
::
min
(
pos
,
s
.
len
()
-
1
);
p
>=
s
.
data
();
p
--
)
{
if
(
*
p
==
c
)
{
return
p
-
s
.
data
();
}
}
return
String
Piece
::
npos
;
return
Piece
::
npos
;
}
StringPiece
SubStr
(
String
Piece
s
,
size_t
pos
,
size_t
n
)
{
Piece
SubStr
(
Piece
s
,
size_t
pos
,
size_t
n
)
{
if
(
pos
>
s
.
len
())
pos
=
s
.
len
();
if
(
n
>
s
.
len
()
-
pos
)
n
=
s
.
len
()
-
pos
;
return
String
Piece
(
s
.
data
()
+
pos
,
n
);
return
Piece
(
s
.
data
()
+
pos
,
n
);
}
std
::
ostream
&
operator
<<
(
std
::
ostream
&
o
,
String
Piece
piece
)
{
std
::
ostream
&
operator
<<
(
std
::
ostream
&
o
,
Piece
piece
)
{
return
o
<<
piece
.
ToString
();
}
}
// namespace string
}
// namespace paddle
paddle/string/
string
piece.h
→
paddle/string/piece.h
浏览文件 @
ea1d3acf
...
...
@@ -20,33 +20,34 @@
#include <string>
namespace
paddle
{
namespace
string
{
//
String
Piece points into a std::string object but doesn't own the
// Piece points into a std::string object but doesn't own the
// string. It is for efficient access to strings. Like Go's string
// type. Not that
String
Piece doesn't mutate the underlying string,
// type. Not that Piece doesn't mutate the underlying string,
// so it is thread-safe given that the underlying string doesn't
// change. Because
String
Piece contains a little data members, and
// change. Because Piece contains a little data members, and
// its syntax is simple as it doesn't own/manage the string, it is
// cheap to construct
String
Pieces and pass them around.
class
String
Piece
{
// cheap to construct Pieces and pass them around.
class
Piece
{
public:
static
const
size_t
npos
=
static_cast
<
size_t
>
(
-
1
);
// We provide non-explicit singleton constructors so users can
// pass in a "const char*" or a "string" wherever a "
String
Piece"
// pass in a "const char*" or a "string" wherever a "Piece"
// is expected. These contructors ensure that if data_ is NULL,
// size_ is 0.
String
Piece
();
String
Piece
(
const
char
*
d
,
size_t
n
);
String
Piece
(
const
char
*
d
);
String
Piece
(
const
std
::
string
&
s
);
Piece
();
Piece
(
const
char
*
d
,
size_t
n
);
Piece
(
const
char
*
d
);
Piece
(
const
std
::
string
&
s
);
const
char
*
data
()
const
{
return
data_
;
}
size_t
len
()
const
{
return
size_
;
}
char
operator
[](
size_t
n
)
const
;
//
String
Piece doesn't own the string, so both iterator and const
// Piece doesn't own the string, so both iterator and const
// iterator are const char* indeed.
typedef
const
char
*
const_iterator
;
typedef
const
char
*
iterator
;
...
...
@@ -63,43 +64,44 @@ private:
// Intentionally copyable
};
int
Compare
(
StringPiece
a
,
String
Piece
b
);
int
Compare
(
Piece
a
,
Piece
b
);
bool
operator
==
(
StringPiece
x
,
String
Piece
y
);
bool
operator
!=
(
StringPiece
x
,
String
Piece
y
);
bool
operator
<
(
StringPiece
x
,
String
Piece
y
);
bool
operator
>
(
StringPiece
x
,
String
Piece
y
);
bool
operator
<=
(
StringPiece
x
,
String
Piece
y
);
bool
operator
>=
(
StringPiece
x
,
String
Piece
y
);
bool
operator
==
(
Piece
x
,
Piece
y
);
bool
operator
!=
(
Piece
x
,
Piece
y
);
bool
operator
<
(
Piece
x
,
Piece
y
);
bool
operator
>
(
Piece
x
,
Piece
y
);
bool
operator
<=
(
Piece
x
,
Piece
y
);
bool
operator
>=
(
Piece
x
,
Piece
y
);
bool
HasPrefix
(
StringPiece
s
,
String
Piece
prefix
);
bool
HasSuffix
(
StringPiece
s
,
String
Piece
suffix
);
bool
HasPrefix
(
Piece
s
,
Piece
prefix
);
bool
HasSuffix
(
Piece
s
,
Piece
suffix
);
StringPiece
SkipPrefix
(
String
Piece
s
,
size_t
n
);
StringPiece
SkipSuffix
(
String
Piece
s
,
size_t
n
);
Piece
SkipPrefix
(
Piece
s
,
size_t
n
);
Piece
SkipSuffix
(
Piece
s
,
size_t
n
);
// Skip the prefix (or suffix) if it matches with the string.
StringPiece
TrimPrefix
(
StringPiece
s
,
String
Piece
prefix
);
StringPiece
TrimSuffix
(
StringPiece
s
,
String
Piece
suffix
);
Piece
TrimPrefix
(
Piece
s
,
Piece
prefix
);
Piece
TrimSuffix
(
Piece
s
,
Piece
suffix
);
// Returns if s contains sub. Any s except for empty s contains an
// empty sub.
bool
Contains
(
StringPiece
s
,
String
Piece
sub
);
bool
Contains
(
Piece
s
,
Piece
sub
);
// Return the first occurrence of sub in s, or npos. If both s and
// sub is empty, it returns npos; otherwise, if only sub is empty, it
// returns 0.
size_t
Index
(
StringPiece
s
,
String
Piece
sub
);
size_t
Index
(
Piece
s
,
Piece
sub
);
// Return the first occurrence of c in s[pos:end], or npos.
size_t
Find
(
String
Piece
s
,
char
c
,
size_t
pos
);
size_t
Find
(
Piece
s
,
char
c
,
size_t
pos
);
// Search range is [0..pos] inclusive. If pos == npos, search everything.
size_t
RFind
(
String
Piece
s
,
char
c
,
size_t
pos
);
size_t
RFind
(
Piece
s
,
char
c
,
size_t
pos
);
StringPiece
SubStr
(
String
Piece
s
,
size_t
pos
,
size_t
n
);
Piece
SubStr
(
Piece
s
,
size_t
pos
,
size_t
n
);
// allow
String
Piece to be logged
std
::
ostream
&
operator
<<
(
std
::
ostream
&
o
,
String
Piece
piece
);
// allow Piece to be logged
std
::
ostream
&
operator
<<
(
std
::
ostream
&
o
,
Piece
piece
);
}
// namespace string
}
// namespace paddle
paddle/string/
string
piece_test.cc
→
paddle/string/piece_test.cc
浏览文件 @
ea1d3acf
...
...
@@ -14,7 +14,7 @@
limitations under the License.
*/
#include "paddle/string
s/string
piece.h"
#include "paddle/string
/
piece.h"
#include <sstream>
...
...
@@ -22,42 +22,44 @@
TEST
(
StringPiece
,
Construct
)
{
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
NULL
,
s
.
data
());
EXPECT_EQ
(
0U
,
s
.
len
());
}
{
EXPECT_THROW
(
paddle
::
StringPiece
s
(
NULL
,
10000U
),
std
::
invalid_argument
);
}
{
paddle
::
StringPiece
s
(
NULL
);
EXPECT_THROW
(
paddle
::
string
::
Piece
s
(
NULL
,
10000U
),
std
::
invalid_argument
);
}
{
paddle
::
string
::
Piece
s
(
NULL
);
EXPECT_EQ
(
0U
,
s
.
len
());
}
{
std
::
string
a
;
EXPECT_EQ
(
0U
,
a
.
size
());
paddle
::
String
Piece
s
(
a
);
paddle
::
string
::
Piece
s
(
a
);
EXPECT_EQ
(
0U
,
s
.
len
());
}
}
TEST
(
StringPiece
,
CopyAndAssign
)
{
paddle
::
String
Piece
empty
;
paddle
::
string
::
Piece
empty
;
EXPECT_EQ
(
0U
,
empty
.
len
());
paddle
::
String
Piece
a
(
"hello"
);
paddle
::
String
Piece
b
=
a
;
paddle
::
string
::
Piece
a
(
"hello"
);
paddle
::
string
::
Piece
b
=
a
;
EXPECT_EQ
(
b
.
len
(),
strlen
(
"hello"
));
EXPECT_EQ
(
a
,
b
);
std
::
string
storage
(
"hello"
);
paddle
::
String
Piece
c
(
storage
);
paddle
::
string
::
Piece
c
(
storage
);
EXPECT_EQ
(
a
,
c
);
EXPECT_NE
(
a
.
data
(),
c
.
data
());
}
TEST
(
StringPiece
,
Compare
)
{
{
paddle
::
String
Piece
a
(
"hello"
);
paddle
::
String
Piece
b
(
"world"
);
paddle
::
string
::
Piece
a
(
"hello"
);
paddle
::
string
::
Piece
b
(
"world"
);
EXPECT_TRUE
(
a
!=
b
);
EXPECT_FALSE
(
a
==
b
);
EXPECT_TRUE
(
a
<
b
);
...
...
@@ -68,7 +70,7 @@ TEST(StringPiece, Compare) {
EXPECT_GT
(
Compare
(
b
,
a
),
0
);
}
{
paddle
::
String
Piece
a
,
b
;
paddle
::
string
::
Piece
a
,
b
;
EXPECT_TRUE
(
a
==
b
);
EXPECT_FALSE
(
a
!=
b
);
EXPECT_FALSE
(
a
<
b
);
...
...
@@ -82,31 +84,31 @@ TEST(StringPiece, Compare) {
TEST
(
StringPiece
,
ToString
)
{
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
std
::
string
(
""
),
s
.
ToString
());
}
{
paddle
::
String
Piece
s
(
NULL
);
paddle
::
string
::
Piece
s
(
NULL
);
EXPECT_EQ
(
std
::
string
(
""
),
s
.
ToString
());
}
{
paddle
::
String
Piece
s
(
"hello"
);
paddle
::
string
::
Piece
s
(
"hello"
);
EXPECT_EQ
(
std
::
string
(
"hello"
),
s
.
ToString
());
}
}
TEST
(
StringPiece
,
HasPrefixSuffix
)
{
using
paddle
::
HasPrefix
;
using
paddle
::
HasSuffix
;
using
paddle
::
string
::
HasPrefix
;
using
paddle
::
string
::
HasSuffix
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_FALSE
(
HasPrefix
(
s
,
"something"
));
EXPECT_TRUE
(
HasPrefix
(
s
,
""
));
EXPECT_FALSE
(
HasSuffix
(
s
,
"something"
));
EXPECT_TRUE
(
HasSuffix
(
s
,
""
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_TRUE
(
HasPrefix
(
s
,
""
));
EXPECT_TRUE
(
HasPrefix
(
s
,
"a"
));
EXPECT_TRUE
(
HasPrefix
(
s
,
"ap"
));
...
...
@@ -120,10 +122,10 @@ TEST(StringPiece, HasPrefixSuffix) {
}
TEST
(
StringPiece
,
SkipPrefixSuffix
)
{
using
paddle
::
SkipPrefix
;
using
paddle
::
SkipSuffix
;
using
paddle
::
string
::
SkipPrefix
;
using
paddle
::
string
::
SkipSuffix
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
""
,
SkipPrefix
(
s
,
0
));
EXPECT_THROW
(
SkipPrefix
(
s
,
1
),
std
::
invalid_argument
);
...
...
@@ -131,7 +133,7 @@ TEST(StringPiece, SkipPrefixSuffix) {
EXPECT_THROW
(
SkipSuffix
(
s
,
1
),
std
::
invalid_argument
);
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
"app"
,
SkipPrefix
(
s
,
0
));
EXPECT_EQ
(
"pp"
,
SkipPrefix
(
s
,
1
));
EXPECT_EQ
(
"p"
,
SkipPrefix
(
s
,
2
));
...
...
@@ -147,10 +149,10 @@ TEST(StringPiece, SkipPrefixSuffix) {
}
TEST
(
StringPiece
,
TrimPrefixSuffix
)
{
using
paddle
::
TrimPrefix
;
using
paddle
::
TrimSuffix
;
using
paddle
::
string
::
TrimPrefix
;
using
paddle
::
string
::
TrimSuffix
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
""
,
TrimPrefix
(
s
,
""
));
EXPECT_EQ
(
""
,
TrimPrefix
(
s
,
"something"
));
...
...
@@ -158,7 +160,7 @@ TEST(StringPiece, TrimPrefixSuffix) {
EXPECT_EQ
(
""
,
TrimSuffix
(
s
,
"something"
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
"app"
,
TrimPrefix
(
s
,
""
));
EXPECT_EQ
(
"pp"
,
TrimPrefix
(
s
,
"a"
));
EXPECT_EQ
(
"p"
,
TrimPrefix
(
s
,
"ap"
));
...
...
@@ -174,14 +176,14 @@ TEST(StringPiece, TrimPrefixSuffix) {
}
TEST
(
StringPiece
,
Contains
)
{
using
paddle
::
Contains
;
using
paddle
::
string
::
Contains
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_FALSE
(
Contains
(
s
,
""
));
EXPECT_FALSE
(
Contains
(
s
,
"something"
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_TRUE
(
Contains
(
s
,
""
));
EXPECT_TRUE
(
Contains
(
s
,
"a"
));
EXPECT_TRUE
(
Contains
(
s
,
"p"
));
...
...
@@ -193,15 +195,15 @@ TEST(StringPiece, Contains) {
}
TEST
(
StringPiece
,
Index
)
{
using
paddle
::
Index
;
auto
npos
=
paddle
::
String
Piece
::
npos
;
using
paddle
::
string
::
Index
;
auto
npos
=
paddle
::
string
::
Piece
::
npos
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
npos
,
Index
(
s
,
""
));
EXPECT_EQ
(
npos
,
Index
(
s
,
"something"
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
0U
,
Index
(
s
,
""
));
EXPECT_EQ
(
0U
,
Index
(
s
,
"a"
));
EXPECT_EQ
(
1U
,
Index
(
s
,
"p"
));
...
...
@@ -213,14 +215,14 @@ TEST(StringPiece, Index) {
}
TEST
(
StringPiece
,
Find
)
{
using
paddle
::
Find
;
auto
npos
=
paddle
::
String
Piece
::
npos
;
using
paddle
::
string
::
Find
;
auto
npos
=
paddle
::
string
::
Piece
::
npos
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
npos
,
Find
(
s
,
'a'
,
0U
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
0U
,
Find
(
s
,
'a'
,
0U
));
EXPECT_EQ
(
1U
,
Find
(
s
,
'p'
,
0U
));
EXPECT_EQ
(
1U
,
Find
(
s
,
'p'
,
1U
));
...
...
@@ -230,14 +232,14 @@ TEST(StringPiece, Find) {
}
TEST
(
StringPiece
,
RFind
)
{
using
paddle
::
RFind
;
auto
npos
=
paddle
::
String
Piece
::
npos
;
using
paddle
::
string
::
RFind
;
auto
npos
=
paddle
::
string
::
Piece
::
npos
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
npos
,
RFind
(
s
,
'a'
,
0U
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
2U
,
RFind
(
s
,
'p'
,
2U
));
EXPECT_EQ
(
0U
,
RFind
(
s
,
'a'
,
2U
));
EXPECT_EQ
(
1U
,
RFind
(
s
,
'p'
,
1U
));
...
...
@@ -247,15 +249,15 @@ TEST(StringPiece, RFind) {
}
TEST
(
StringPiece
,
SubStr
)
{
using
paddle
::
SubStr
;
using
paddle
::
string
::
SubStr
;
{
paddle
::
String
Piece
s
;
paddle
::
string
::
Piece
s
;
EXPECT_EQ
(
""
,
SubStr
(
s
,
0
,
0
));
EXPECT_EQ
(
""
,
SubStr
(
s
,
0
,
1
));
EXPECT_EQ
(
""
,
SubStr
(
s
,
1
,
0
));
}
{
paddle
::
String
Piece
s
(
"app"
);
paddle
::
string
::
Piece
s
(
"app"
);
EXPECT_EQ
(
""
,
SubStr
(
s
,
0
,
0
));
EXPECT_EQ
(
""
,
SubStr
(
s
,
1
,
0
));
EXPECT_EQ
(
""
,
SubStr
(
s
,
2
,
0
));
...
...
@@ -279,15 +281,15 @@ TEST(StringPiece, SubStr) {
}
TEST
(
StringPiece
,
StreamOutput
)
{
using
paddle
::
String
Piece
;
using
paddle
::
string
::
Piece
;
std
::
stringstream
o
;
o
<<
String
Piece
();
o
<<
paddle
::
string
::
Piece
();
EXPECT_EQ
(
""
,
o
.
str
());
o
<<
String
Piece
(
"hello"
);
o
<<
paddle
::
string
::
Piece
(
"hello"
);
EXPECT_EQ
(
"hello"
,
o
.
str
());
o
<<
String
Piece
();
o
<<
paddle
::
string
::
Piece
();
EXPECT_EQ
(
"hello"
,
o
.
str
());
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录