Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
d652ef29
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
1 年多 前同步成功
通知
0
Star
18
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Harfbuzz
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d652ef29
编写于
7月 10, 2018
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move hb_vector_t and hb_lockable_set_t to hb-dsalgs.hh
上级
9e53b083
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
311 addition
and
315 deletion
+311
-315
src/hb-dsalgs.hh
src/hb-dsalgs.hh
+311
-0
src/hb-private.hh
src/hb-private.hh
+0
-315
未找到文件。
src/hb-dsalgs.hh
浏览文件 @
d652ef29
...
...
@@ -209,4 +209,315 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o
}
#define HB_VECTOR_INIT {0, 0, false, nullptr}
template
<
typename
Type
,
unsigned
int
StaticSize
=
8
>
struct
hb_vector_t
{
unsigned
int
len
;
unsigned
int
allocated
;
bool
successful
;
Type
*
arrayZ
;
Type
static_array
[
StaticSize
];
void
init
(
void
)
{
len
=
0
;
allocated
=
ARRAY_LENGTH
(
static_array
);
successful
=
true
;
arrayZ
=
static_array
;
}
inline
Type
&
operator
[]
(
unsigned
int
i
)
{
if
(
unlikely
(
i
>=
len
))
return
Crap
(
Type
);
return
arrayZ
[
i
];
}
inline
const
Type
&
operator
[]
(
unsigned
int
i
)
const
{
if
(
unlikely
(
i
>=
len
))
return
Null
(
Type
);
return
arrayZ
[
i
];
}
inline
Type
*
push
(
void
)
{
if
(
unlikely
(
!
resize
(
len
+
1
)))
return
&
Crap
(
Type
);
return
&
arrayZ
[
len
-
1
];
}
inline
Type
*
push
(
const
Type
&
v
)
{
Type
*
p
=
push
();
*
p
=
v
;
return
p
;
}
/* Allocate for size but don't adjust len. */
inline
bool
alloc
(
unsigned
int
size
)
{
if
(
unlikely
(
!
successful
))
return
false
;
if
(
likely
(
size
<=
allocated
))
return
true
;
/* Reallocate */
unsigned
int
new_allocated
=
allocated
;
while
(
size
>=
new_allocated
)
new_allocated
+=
(
new_allocated
>>
1
)
+
8
;
Type
*
new_array
=
nullptr
;
if
(
arrayZ
==
static_array
)
{
new_array
=
(
Type
*
)
calloc
(
new_allocated
,
sizeof
(
Type
));
if
(
new_array
)
memcpy
(
new_array
,
arrayZ
,
len
*
sizeof
(
Type
));
}
else
{
bool
overflows
=
(
new_allocated
<
allocated
)
||
_hb_unsigned_int_mul_overflows
(
new_allocated
,
sizeof
(
Type
));
if
(
likely
(
!
overflows
))
new_array
=
(
Type
*
)
realloc
(
arrayZ
,
new_allocated
*
sizeof
(
Type
));
}
if
(
unlikely
(
!
new_array
))
{
successful
=
false
;
return
false
;
}
arrayZ
=
new_array
;
allocated
=
new_allocated
;
return
true
;
}
inline
bool
resize
(
int
size_
)
{
unsigned
int
size
=
size_
<
0
?
0u
:
(
unsigned
int
)
size_
;
if
(
!
alloc
(
size
))
return
false
;
if
(
size
>
len
)
memset
(
arrayZ
+
len
,
0
,
(
size
-
len
)
*
sizeof
(
*
arrayZ
));
len
=
size
;
return
true
;
}
inline
void
pop
(
void
)
{
if
(
!
len
)
return
;
len
--
;
}
inline
void
remove
(
unsigned
int
i
)
{
if
(
unlikely
(
i
>=
len
))
return
;
memmove
(
static_cast
<
void
*>
(
&
arrayZ
[
i
]),
static_cast
<
void
*>
(
&
arrayZ
[
i
+
1
]),
(
len
-
i
-
1
)
*
sizeof
(
Type
));
len
--
;
}
inline
void
shrink
(
int
size_
)
{
unsigned
int
size
=
size_
<
0
?
0u
:
(
unsigned
int
)
size_
;
if
(
size
<
len
)
len
=
size
;
}
template
<
typename
T
>
inline
Type
*
find
(
T
v
)
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
arrayZ
[
i
]
==
v
)
return
&
arrayZ
[
i
];
return
nullptr
;
}
template
<
typename
T
>
inline
const
Type
*
find
(
T
v
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
arrayZ
[
i
]
==
v
)
return
&
arrayZ
[
i
];
return
nullptr
;
}
inline
void
qsort
(
int
(
*
cmp
)(
const
void
*
,
const
void
*
))
{
::
qsort
(
arrayZ
,
len
,
sizeof
(
Type
),
cmp
);
}
inline
void
qsort
(
void
)
{
::
qsort
(
arrayZ
,
len
,
sizeof
(
Type
),
Type
::
cmp
);
}
inline
void
qsort
(
unsigned
int
start
,
unsigned
int
end
)
{
::
qsort
(
arrayZ
+
start
,
end
-
start
,
sizeof
(
Type
),
Type
::
cmp
);
}
template
<
typename
T
>
inline
Type
*
lsearch
(
const
T
&
x
)
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
0
==
this
->
arrayZ
[
i
].
cmp
(
&
x
))
return
&
arrayZ
[
i
];
return
nullptr
;
}
template
<
typename
T
>
inline
Type
*
bsearch
(
const
T
&
x
)
{
unsigned
int
i
;
return
bfind
(
x
,
&
i
)
?
&
arrayZ
[
i
]
:
nullptr
;
}
template
<
typename
T
>
inline
const
Type
*
bsearch
(
const
T
&
x
)
const
{
unsigned
int
i
;
return
bfind
(
x
,
&
i
)
?
&
arrayZ
[
i
]
:
nullptr
;
}
template
<
typename
T
>
inline
bool
bfind
(
const
T
&
x
,
unsigned
int
*
i
)
const
{
int
min
=
0
,
max
=
(
int
)
this
->
len
-
1
;
while
(
min
<=
max
)
{
int
mid
=
(
min
+
max
)
/
2
;
int
c
=
this
->
arrayZ
[
mid
].
cmp
(
&
x
);
if
(
c
<
0
)
max
=
mid
-
1
;
else
if
(
c
>
0
)
min
=
mid
+
1
;
else
{
*
i
=
mid
;
return
true
;
}
}
if
(
max
<
0
||
(
max
<
(
int
)
this
->
len
&&
this
->
arrayZ
[
max
].
cmp
(
&
x
)
>
0
))
max
++
;
*
i
=
max
;
return
false
;
}
inline
void
fini
(
void
)
{
if
(
arrayZ
!=
static_array
)
free
(
arrayZ
);
arrayZ
=
nullptr
;
allocated
=
len
=
0
;
}
};
template
<
typename
Type
>
struct
hb_auto_t
:
Type
{
hb_auto_t
(
void
)
{
Type
::
init
();
}
~
hb_auto_t
(
void
)
{
Type
::
fini
();
}
private:
/* Hide */
void
init
(
void
)
{}
void
fini
(
void
)
{}
};
template
<
typename
Type
>
struct
hb_auto_array_t
:
hb_auto_t
<
hb_vector_t
<
Type
>
>
{};
#define HB_LOCKABLE_SET_INIT {HB_VECTOR_INIT}
template
<
typename
item_t
,
typename
lock_t
>
struct
hb_lockable_set_t
{
hb_vector_t
<
item_t
,
1
>
items
;
inline
void
init
(
void
)
{
items
.
init
();
}
template
<
typename
T
>
inline
item_t
*
replace_or_insert
(
T
v
,
lock_t
&
l
,
bool
replace
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
{
if
(
replace
)
{
item_t
old
=
*
item
;
*
item
=
v
;
l
.
unlock
();
old
.
fini
();
}
else
{
item
=
nullptr
;
l
.
unlock
();
}
}
else
{
item
=
items
.
push
(
v
);
l
.
unlock
();
}
return
item
;
}
template
<
typename
T
>
inline
void
remove
(
T
v
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
{
item_t
old
=
*
item
;
*
item
=
items
[
items
.
len
-
1
];
items
.
pop
();
l
.
unlock
();
old
.
fini
();
}
else
{
l
.
unlock
();
}
}
template
<
typename
T
>
inline
bool
find
(
T
v
,
item_t
*
i
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
*
i
=
*
item
;
l
.
unlock
();
return
!!
item
;
}
template
<
typename
T
>
inline
item_t
*
find_or_insert
(
T
v
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
!
item
)
{
item
=
items
.
push
(
v
);
}
l
.
unlock
();
return
item
;
}
inline
void
fini
(
lock_t
&
l
)
{
if
(
!
items
.
len
)
{
/* No need for locking. */
items
.
fini
();
return
;
}
l
.
lock
();
while
(
items
.
len
)
{
item_t
old
=
items
[
items
.
len
-
1
];
items
.
pop
();
l
.
unlock
();
old
.
fini
();
l
.
lock
();
}
items
.
fini
();
l
.
unlock
();
}
};
#endif
/* HB_DSALGS_HH */
src/hb-private.hh
浏览文件 @
d652ef29
...
...
@@ -652,321 +652,6 @@ struct CrapOrNull<const Type> {
#define CrapOrNull(Type) CrapOrNull<Type>::get ()
/* arrays and maps */
#define HB_VECTOR_INIT {0, 0, false, nullptr}
template
<
typename
Type
,
unsigned
int
StaticSize
=
8
>
struct
hb_vector_t
{
unsigned
int
len
;
unsigned
int
allocated
;
bool
successful
;
Type
*
arrayZ
;
Type
static_array
[
StaticSize
];
void
init
(
void
)
{
len
=
0
;
allocated
=
ARRAY_LENGTH
(
static_array
);
successful
=
true
;
arrayZ
=
static_array
;
}
inline
Type
&
operator
[]
(
unsigned
int
i
)
{
if
(
unlikely
(
i
>=
len
))
return
Crap
(
Type
);
return
arrayZ
[
i
];
}
inline
const
Type
&
operator
[]
(
unsigned
int
i
)
const
{
if
(
unlikely
(
i
>=
len
))
return
Null
(
Type
);
return
arrayZ
[
i
];
}
inline
Type
*
push
(
void
)
{
if
(
unlikely
(
!
resize
(
len
+
1
)))
return
&
Crap
(
Type
);
return
&
arrayZ
[
len
-
1
];
}
inline
Type
*
push
(
const
Type
&
v
)
{
Type
*
p
=
push
();
*
p
=
v
;
return
p
;
}
/* Allocate for size but don't adjust len. */
inline
bool
alloc
(
unsigned
int
size
)
{
if
(
unlikely
(
!
successful
))
return
false
;
if
(
likely
(
size
<=
allocated
))
return
true
;
/* Reallocate */
unsigned
int
new_allocated
=
allocated
;
while
(
size
>=
new_allocated
)
new_allocated
+=
(
new_allocated
>>
1
)
+
8
;
Type
*
new_array
=
nullptr
;
if
(
arrayZ
==
static_array
)
{
new_array
=
(
Type
*
)
calloc
(
new_allocated
,
sizeof
(
Type
));
if
(
new_array
)
memcpy
(
new_array
,
arrayZ
,
len
*
sizeof
(
Type
));
}
else
{
bool
overflows
=
(
new_allocated
<
allocated
)
||
_hb_unsigned_int_mul_overflows
(
new_allocated
,
sizeof
(
Type
));
if
(
likely
(
!
overflows
))
new_array
=
(
Type
*
)
realloc
(
arrayZ
,
new_allocated
*
sizeof
(
Type
));
}
if
(
unlikely
(
!
new_array
))
{
successful
=
false
;
return
false
;
}
arrayZ
=
new_array
;
allocated
=
new_allocated
;
return
true
;
}
inline
bool
resize
(
int
size_
)
{
unsigned
int
size
=
size_
<
0
?
0u
:
(
unsigned
int
)
size_
;
if
(
!
alloc
(
size
))
return
false
;
if
(
size
>
len
)
memset
(
arrayZ
+
len
,
0
,
(
size
-
len
)
*
sizeof
(
*
arrayZ
));
len
=
size
;
return
true
;
}
inline
void
pop
(
void
)
{
if
(
!
len
)
return
;
len
--
;
}
inline
void
remove
(
unsigned
int
i
)
{
if
(
unlikely
(
i
>=
len
))
return
;
memmove
(
static_cast
<
void
*>
(
&
arrayZ
[
i
]),
static_cast
<
void
*>
(
&
arrayZ
[
i
+
1
]),
(
len
-
i
-
1
)
*
sizeof
(
Type
));
len
--
;
}
inline
void
shrink
(
int
size_
)
{
unsigned
int
size
=
size_
<
0
?
0u
:
(
unsigned
int
)
size_
;
if
(
size
<
len
)
len
=
size
;
}
template
<
typename
T
>
inline
Type
*
find
(
T
v
)
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
arrayZ
[
i
]
==
v
)
return
&
arrayZ
[
i
];
return
nullptr
;
}
template
<
typename
T
>
inline
const
Type
*
find
(
T
v
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
arrayZ
[
i
]
==
v
)
return
&
arrayZ
[
i
];
return
nullptr
;
}
inline
void
qsort
(
int
(
*
cmp
)(
const
void
*
,
const
void
*
))
{
::
qsort
(
arrayZ
,
len
,
sizeof
(
Type
),
cmp
);
}
inline
void
qsort
(
void
)
{
::
qsort
(
arrayZ
,
len
,
sizeof
(
Type
),
Type
::
cmp
);
}
inline
void
qsort
(
unsigned
int
start
,
unsigned
int
end
)
{
::
qsort
(
arrayZ
+
start
,
end
-
start
,
sizeof
(
Type
),
Type
::
cmp
);
}
template
<
typename
T
>
inline
Type
*
lsearch
(
const
T
&
x
)
{
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
if
(
0
==
this
->
arrayZ
[
i
].
cmp
(
&
x
))
return
&
arrayZ
[
i
];
return
nullptr
;
}
template
<
typename
T
>
inline
Type
*
bsearch
(
const
T
&
x
)
{
unsigned
int
i
;
return
bfind
(
x
,
&
i
)
?
&
arrayZ
[
i
]
:
nullptr
;
}
template
<
typename
T
>
inline
const
Type
*
bsearch
(
const
T
&
x
)
const
{
unsigned
int
i
;
return
bfind
(
x
,
&
i
)
?
&
arrayZ
[
i
]
:
nullptr
;
}
template
<
typename
T
>
inline
bool
bfind
(
const
T
&
x
,
unsigned
int
*
i
)
const
{
int
min
=
0
,
max
=
(
int
)
this
->
len
-
1
;
while
(
min
<=
max
)
{
int
mid
=
(
min
+
max
)
/
2
;
int
c
=
this
->
arrayZ
[
mid
].
cmp
(
&
x
);
if
(
c
<
0
)
max
=
mid
-
1
;
else
if
(
c
>
0
)
min
=
mid
+
1
;
else
{
*
i
=
mid
;
return
true
;
}
}
if
(
max
<
0
||
(
max
<
(
int
)
this
->
len
&&
this
->
arrayZ
[
max
].
cmp
(
&
x
)
>
0
))
max
++
;
*
i
=
max
;
return
false
;
}
inline
void
fini
(
void
)
{
if
(
arrayZ
!=
static_array
)
free
(
arrayZ
);
arrayZ
=
nullptr
;
allocated
=
len
=
0
;
}
};
template
<
typename
Type
>
struct
hb_auto_t
:
Type
{
hb_auto_t
(
void
)
{
Type
::
init
();
}
~
hb_auto_t
(
void
)
{
Type
::
fini
();
}
private:
/* Hide */
void
init
(
void
)
{}
void
fini
(
void
)
{}
};
template
<
typename
Type
>
struct
hb_auto_array_t
:
hb_auto_t
<
hb_vector_t
<
Type
>
>
{};
#define HB_LOCKABLE_SET_INIT {HB_VECTOR_INIT}
template
<
typename
item_t
,
typename
lock_t
>
struct
hb_lockable_set_t
{
hb_vector_t
<
item_t
,
1
>
items
;
inline
void
init
(
void
)
{
items
.
init
();
}
template
<
typename
T
>
inline
item_t
*
replace_or_insert
(
T
v
,
lock_t
&
l
,
bool
replace
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
{
if
(
replace
)
{
item_t
old
=
*
item
;
*
item
=
v
;
l
.
unlock
();
old
.
fini
();
}
else
{
item
=
nullptr
;
l
.
unlock
();
}
}
else
{
item
=
items
.
push
(
v
);
l
.
unlock
();
}
return
item
;
}
template
<
typename
T
>
inline
void
remove
(
T
v
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
{
item_t
old
=
*
item
;
*
item
=
items
[
items
.
len
-
1
];
items
.
pop
();
l
.
unlock
();
old
.
fini
();
}
else
{
l
.
unlock
();
}
}
template
<
typename
T
>
inline
bool
find
(
T
v
,
item_t
*
i
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
item
)
*
i
=
*
item
;
l
.
unlock
();
return
!!
item
;
}
template
<
typename
T
>
inline
item_t
*
find_or_insert
(
T
v
,
lock_t
&
l
)
{
l
.
lock
();
item_t
*
item
=
items
.
find
(
v
);
if
(
!
item
)
{
item
=
items
.
push
(
v
);
}
l
.
unlock
();
return
item
;
}
inline
void
fini
(
lock_t
&
l
)
{
if
(
!
items
.
len
)
{
/* No need for locking. */
items
.
fini
();
return
;
}
l
.
lock
();
while
(
items
.
len
)
{
item_t
old
=
items
[
items
.
len
-
1
];
items
.
pop
();
l
.
unlock
();
old
.
fini
();
l
.
lock
();
}
items
.
fini
();
l
.
unlock
();
}
};
/* ASCII tag/character handling */
static
inline
bool
ISALPHA
(
unsigned
char
c
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录