Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
e1acff80
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看板
提交
e1acff80
编写于
8月 06, 2018
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move hb_vector_t to hb-vector-private.hh
上级
be336dad
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
346 addition
and
300 deletion
+346
-300
src/Makefile.sources
src/Makefile.sources
+1
-0
src/hb-dsalgs.hh
src/hb-dsalgs.hh
+0
-297
src/hb-object-private.hh
src/hb-object-private.hh
+106
-3
src/hb-vector-private.hh
src/hb-vector-private.hh
+239
-0
未找到文件。
src/Makefile.sources
浏览文件 @
e1acff80
...
...
@@ -52,6 +52,7 @@ HB_BASE_sources = \
hb-string-array.hh
\
hb-unicode-private.hh
\
hb-unicode.cc
\
hb-vector-private.hh
\
hb-utf-private.hh
\
hb-warning.cc
\
$(NULL)
...
...
src/hb-dsalgs.hh
浏览文件 @
e1acff80
...
...
@@ -488,303 +488,6 @@ 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
;
/* == 0 means allocation failed. */
Type
*
arrayZ
;
Type
static_array
[
StaticSize
];
void
init
(
void
)
{
len
=
0
;
allocated
=
ARRAY_LENGTH
(
static_array
);
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
(
!
allocated
))
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_mul_overflows
(
new_allocated
,
sizeof
(
Type
));
if
(
likely
(
!
overflows
))
new_array
=
(
Type
*
)
realloc
(
arrayZ
,
new_allocated
*
sizeof
(
Type
));
}
if
(
unlikely
(
!
new_array
))
{
allocated
=
0
;
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
;
}
};
#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
();
}
};
template
<
typename
Type
>
struct
hb_auto_t
:
Type
{
...
...
src/hb-object-private.hh
浏览文件 @
e1acff80
...
...
@@ -35,9 +35,108 @@
#include "hb-private.hh"
#include "hb-atomic-private.hh"
#include "hb-mutex-private.hh"
#include "hb-vector-private.hh"
/* reference_count */
/*
* Lockable set
*/
#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
();
}
};
/*
* Reference-count.
*/
#define HB_REFERENCE_COUNT_INERT_VALUE 0
#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
...
...
@@ -89,7 +188,9 @@ struct hb_user_data_array_t
};
/* object_header */
/*
* Object header
*/
struct
hb_object_header_t
{
...
...
@@ -103,7 +204,9 @@ struct hb_object_header_t
};
/* object */
/*
* Object
*/
template
<
typename
Type
>
static
inline
void
hb_object_trace
(
const
Type
*
obj
,
const
char
*
function
)
...
...
src/hb-vector-private.hh
0 → 100644
浏览文件 @
e1acff80
/*
* Copyright © 2017,2018 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Red Hat Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_VECTOR_PRIVATE_HH
#define HB_VECTOR_PRIVATE_HH
#include "hb-private.hh"
#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
;
/* == 0 means allocation failed. */
Type
*
arrayZ
;
Type
static_array
[
StaticSize
];
void
init
(
void
)
{
len
=
0
;
allocated
=
ARRAY_LENGTH
(
static_array
);
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
(
!
allocated
))
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_mul_overflows
(
new_allocated
,
sizeof
(
Type
));
if
(
likely
(
!
overflows
))
new_array
=
(
Type
*
)
realloc
(
arrayZ
,
new_allocated
*
sizeof
(
Type
));
}
if
(
unlikely
(
!
new_array
))
{
allocated
=
0
;
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
;
}
};
#endif
/* HB_VECTOR_PRIVATE_HH */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录