1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2015-09-27 23:04:13 -04:00
parent fa70c05354
commit 8e18af05b6
84 changed files with 2795 additions and 507 deletions

View File

@@ -18,19 +18,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.core.primitives; import gplx.*; import gplx.core.*;
public class Int_pool {
private final List_adp available_list = List_adp_.new_(); private int available_len;
// private final Bry_bfr dbg_bfr = Bry_bfr.new_();
private int uid_max = -1;
public void Clear() {
available_list.Clear();
available_len = 0;
uid_max = -1;
synchronized (available_list) {
available_list.Clear();
available_len = 0;
uid_max = -1;
}
}
public int Get_next() {
synchronized (available_list) {
if (available_len == 0)
if (available_len == 0) {
// dbg_bfr.Add_str("+:u:").Add_int_variable(uid_max + 1).Add_byte_nl();
return ++uid_max;
}
else {
Int_obj_val val = (Int_obj_val)List_adp_.Pop_last(available_list);
--available_len;
// dbg_bfr.Add_str("+:a:").Add_int_variable(val.Val()).Add_byte_nl();
return val.Val();
}
}
@@ -40,17 +46,22 @@ public class Int_pool {
synchronized (available_list) {
if (available_len == 0 && v == uid_max) {
--this.uid_max;
// dbg_bfr.Add_str("-:m:").Add_int_variable(v).Add_byte_nl();
return;
}
if (available_len == uid_max) {
available_list.Add(Int_obj_val.new_(v));
available_list.Sort();
for (int i = 0; i < available_len; ++i) {
Int_obj_val itm = (Int_obj_val)available_list.Get_at(i);
if (i != itm.Val()) throw Err_.new_("core", "available_list out of order", "contents", available_list.To_str());
if (i != itm.Val())
throw Err_.new_("core", "available_list out of order", "contents", available_list.To_str());
}
// dbg_bfr.Add_str("-:c:").Add_int_variable(v).Add_byte_nl();
this.Clear();
}
else {
// dbg_bfr.Add_str("-:a:").Add_int_variable(v).Add_byte_nl();
available_list.Add(Int_obj_val.new_(v));
++available_len;
}

View File

@@ -52,6 +52,14 @@ public class Int_pool_tst {
tstr.Exec_del(2);
tstr.Test_get(0);
}
@Test public void Del__out_of_order_2() {
tstr.Test_get(0);
tstr.Test_get(1);
tstr.Test_get(2);
tstr.Exec_del(1);
tstr.Exec_del(2);
tstr.Exec_del(0);
}
}
class Int_pool_tstr {
private final Int_pool pool = new Int_pool();