Skip to content

Commit 05aa4db

Browse files
author
vip601115211
committed
增加测试文件,修改resize方法,完善readme
1 parent 868a0ac commit 05aa4db

File tree

5 files changed

+139
-38
lines changed

5 files changed

+139
-38
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ tests/*/*.out
3333
tests/*/*.php
3434
tests/*/*.exp
3535
tests/*/*.log
36-
tests/*/*.sh
36+
tests/*/*.sh
37+
tmp-php.ini

README.md

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
ArrayList是一个使用使用C实现类似于Java ArrayList的扩展。
66
适用于大数组环境,提高内存使用率,比原生array使用更少的内存。
77

8-
## linux mac 环境下编译安装
8+
## Requirement
9+
php7.0 +
10+
11+
## Install
12+
# Compile ArrayList in Linux mac
913

1014
```shell
1115
phpize
@@ -14,8 +18,22 @@ make
1418
make install
1519
```
1620

17-
支持函数
21+
## Document
22+
```php
23+
ArrayList implements ArrayAccess {
24+
/* 方法 */
25+
public __construct ([ int $size = 0 ] )
26+
public count ( void ) : int
27+
public static fromArray (void) : array
28+
public getSize ( void ) : int
29+
public get ( int $index ) : mixed
30+
public add (mixed $newval ) : void
31+
public toArray ( void ) : array
32+
}
33+
34+
```
1835

36+
## More
1937
```php
2038
$ret = new ArrayList();
2139
$ret->add(1);
@@ -25,31 +43,33 @@ $ret->getSize();
2543
$ret->toArray();
2644
```
2745

28-
二维ArrayList
29-
3046
```php
31-
$ret = new ArrayList(10);
32-
$ret2 = new ArrayList(3);
33-
$ret2->add(1);
34-
$ret2->add(2);
35-
$ret2->add(3);
47+
const SIZE = 20;
48+
$ret2 = new ArrayList();
49+
$ret3 = new ArrayList();
50+
for ($i = 0; $i < SIZE; $i++)
51+
{
52+
$ret2->add((string)$i);
53+
$ret3->add((string)(SIZE-$i));
54+
}
55+
$ret = new Arraylist();
3656
$ret->add($ret2);
37-
for ($i=0; $i<$ret->count(); $i++) {
38-
for ($j=0; $j<$ret2->count(); $j++) {
39-
var_dump($ret2->get($j));
40-
}
57+
$ret->add($ret3);
58+
for ($i = 0; $i < $ret->count(); $i++) {
59+
for($j = 0; $j < $ret->get($i)->count(); $j++) {
60+
var_dump($ret->get($i)->get($j));
61+
}
62+
echo "\n";
4163
}
4264
```
4365

44-
ArrayList存array
45-
4666
```php
47-
$ret3 = new ArrayList(1);
48-
$ret3->add([1, 3,4,5, 6,]);
49-
$ret3->add([3, 4,5,6, 7,]);
50-
for ($i=0; $i<$ret3->count(); $i++){
51-
foreach($ret3->get($i) as $v){
52-
var_dump($v);
53-
}
67+
$ret = new ArrayList();
68+
$ret->add([1, 3, 4, 5, 6,]);
69+
$ret->add([8, 9, 10]);
70+
for ($i = 0; $i< $ret->count(); $i++) {
71+
foreach($ret->get($i) as $v){
72+
var_dump($v);
73+
}
5474
}
5575
```

arraylist.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -130,22 +130,13 @@ PHP_METHOD(arraylist, __construct)
130130

131131
static void arraylist_resize(arraylist *array) /* {{{ */
132132
{
133-
if (array->nNextIndex >= array->nSize)
134-
{
135-
size_t i = 0;
133+
if (array->nNextIndex < array->nSize) {
134+
return;
135+
} else if (array->nNextIndex >= array->nSize) {
136136
size_t oldSize = array->nSize == 1? 2 : array->nSize;
137137
size_t newSize = oldSize + (oldSize >> 1);
138-
zval *elements = (zval *)ecalloc(newSize, sizeof(zval));
139-
for (; i < array->nSize; i++)
140-
{
141-
if (!Z_ISUNDEF(array->elements[i])) {
142-
elements[i] = array->elements[i];
143-
zval_dtor(&array->elements[i]);
144-
}
145-
}
146-
efree(array->elements);
147-
array->elements = NULL;
148-
array->elements = elements;
138+
array->elements = safe_erealloc(array->elements, newSize, sizeof(zval), 0);
139+
memset(array->elements + array->nSize, '\0', sizeof(zval) * (newSize - array->nSize));
149140
array->nSize = newSize;
150141
}
151142
}
@@ -174,7 +165,6 @@ static inline void arraylist_object_write_dimension_helper(arraylist_object *int
174165
}
175166
ZVAL_DEREF(value);
176167
ZVAL_COPY(&intern->array.elements[index], value);
177-
Z_TRY_ADDREF_P(value);
178168
}
179169
}
180170
/* }}} */

tests/003.phpt

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
--TEST--
2+
Check for arraylist multidimensional arrays
3+
--SKIPIF--
4+
<?php if (!extension_loaded("arraylist")) print "skip"; ?>
5+
--FILE--
6+
<?php
7+
const SIZE = 20;
8+
$ret2 = new ArrayList();
9+
$ret3 = new ArrayList();
10+
for ($i = 0; $i < SIZE; $i++)
11+
{
12+
$ret2->add((string)$i);
13+
$ret3->add((string)(SIZE-$i));
14+
}
15+
$ret = new Arraylist();
16+
$ret->add($ret2);
17+
$ret->add($ret3);
18+
for ($i = 0; $i < $ret->count(); $i++) {
19+
for($j = 0; $j < $ret->get($i)->count(); $j++) {
20+
var_dump($ret->get($i)->get($j));
21+
}
22+
echo "\n";
23+
}
24+
?>
25+
--EXPECT--
26+
string(1) "0"
27+
string(1) "1"
28+
string(1) "2"
29+
string(1) "3"
30+
string(1) "4"
31+
string(1) "5"
32+
string(1) "6"
33+
string(1) "7"
34+
string(1) "8"
35+
string(1) "9"
36+
string(2) "10"
37+
string(2) "11"
38+
string(2) "12"
39+
string(2) "13"
40+
string(2) "14"
41+
string(2) "15"
42+
string(2) "16"
43+
string(2) "17"
44+
string(2) "18"
45+
string(2) "19"
46+
47+
string(2) "20"
48+
string(2) "19"
49+
string(2) "18"
50+
string(2) "17"
51+
string(2) "16"
52+
string(2) "15"
53+
string(2) "14"
54+
string(2) "13"
55+
string(2) "12"
56+
string(2) "11"
57+
string(2) "10"
58+
string(1) "9"
59+
string(1) "8"
60+
string(1) "7"
61+
string(1) "6"
62+
string(1) "5"
63+
string(1) "4"
64+
string(1) "3"
65+
string(1) "2"
66+
string(1) "1"

tests/004.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Check for arraylist array
3+
--SKIPIF--
4+
<?php if (!extension_loaded("arraylist")) print "skip"; ?>
5+
--FILE--
6+
<?php
7+
$ret = new ArrayList();
8+
$ret->add([1, 3, 4, 5, 6,]);
9+
$ret->add([8, 9, 10]);
10+
for ($i = 0; $i< $ret->count(); $i++) {
11+
foreach($ret->get($i) as $v){
12+
var_dump($v);
13+
}
14+
}
15+
?>
16+
--EXPECT--
17+
int(1)
18+
int(3)
19+
int(4)
20+
int(5)
21+
int(6)
22+
int(8)
23+
int(9)
24+
int(10)

0 commit comments

Comments
 (0)