📄 byte_array.java
字号:
} else { //FAST=false for (int q = 0; q < len; ++q) { final int nsrc = srcoff + q; final int ndst = dstoff + q; dst.set(ndst, this.get(nsrc)); }//for }//if(FAST) } public final void copyFrom(byte_AccessibleArray src, int srcoff, int dstoff, int len) { src.copyTo(srcoff, this, dstoff, len); } public final void clear(int off, int len) { if (FAST) { //FAST==true byte[] bb = new byte[Math.min(50, this.length())]; final int c = this.length() / bb.length; for (int i = 0; i <= c; ++i) { final int off1 = off + c * bb.length; if (off1 < this.length()) { //System.arraycopy(bb,0,a,off1,Math.min(bb.length,a.length-off1)); copyFrom(bb, 0, off1, Math.min(bb.length, this.length() - off1)); }//if(off1<this.length()) }//for } else { //FAST==false for (int i = off; i < off + len; ++i) { set(i, (byte) 0); }//for }//if(FAST) }//-------------------------------------------------------------------- /* //� ��� ��� �������� ���������, ��������������� ������������� ��� byte_array //�������� ��� ����������� � ����� �� ������ ����������������� //��� ��� ����� ��� �� �������. //��� � ���������� ����� byte_array ������ byte_AccessibleArray, //� ���������� ������������ ��� ���������� ���������. public static final void Copy(byte_array src,int srcoff, byte_array dst, int dstoff, int len){ //if(len==0)return; //src.copyTo(srcoff,dst,dstoff,len); if(len==0)return; if(FAST){ //faster (but possibly more buggy) algorithm, using System.arraycopy //FAST==true Vector spl = new Vector(); final int d=dstoff-srcoff; final int end=srcoff+len; //��� ������������ � �������� � "������� ���������" //������� ��������� int ps=(srcoff/src.block_size)*src.block_size; int pd=(dstoff/dst.block_size)*dst.block_size - d; ps=ps+src.block_size; pd=pd+dst.block_size; spl.addElement(new Integer(srcoff)); while(pd<end || ps<end){ final int last=elem(spl.size()-1,spl); if(ps<pd){ if(last<ps){spl.addElement(new Integer(ps));} ps=ps+src.block_size; }else{ if(last<pd){spl.addElement(new Integer(pd));} pd=pd+dst.block_size; }//if }//wihile spl.addElement(new Integer(end)); //������ � ��� ���� �������� ����� �������� spl //����� ��� ��� ������� �� "������������ ��������" //������ �� �������� spl �������� �� ���� �������� //(�� ��� ��� ������� ����! ;) ) //��� ���� ��� ��� � ��� ������ ������ ��������, //�� ��������� ������ � ������� � end - ������ �� ����������! //���� ���������� ����������� � ��� �� ����� "������", //� ������� ����������� �������������, �� ���� ��� ������ //��� ������ ��������� ����������� �����. //�������� ������ ����������� ��� ��������(System.arraycopy)... //for(int i=0;i<spl.size();++i){ // System.out.println(spl.elementAt(i)); //}//for //System.out.println(); final int A,B,C; if(srcoff<dstoff){ //������ ������ A=spl.size()-2;B=0;C=-1; }else{ //����� ������� A=0;B=spl.size()-2;C=1; }//if //System.out.println("!!!!!!!!!!!!!!! A="+A+" spl.size()="+spl.size()+" srcoff="+srcoff+" dstoff="+dstoff); for(int i=A;(C>0?i<=B:i>=B);i=i+C){ //System.out.println("!!!!!!!!!!!!!!! i="+i+" A="+A+" B="+B); int b=((Integer)spl.elementAt(i)).intValue(); int e=((Integer)spl.elementAt(i+1)).intValue()-1; int l=e-b+1; final int src_c=b/src.block_size; final int src_r=b%src.block_size; final int dst_b=b+d; final int dst_c=(dst_b)/dst.block_size; final int dst_r=(dst_b)%dst.block_size; //System.out.println("b="+b+" e="+e+" l="+l+": src_c="+src_c+" src_r="+src_r+" dst_c="+dst_c+" dst_r="+dst_r); if(src.arrays[src_c]==null){ if(dst.arrays[dst_c]!=null) { if(dst_r==0&&dst.arrays[dst_c].length==l){ dst.arrays[dst_c]=null; }else{ clear(dst.arrays[dst_c],dst_b,l); }//if }//if }else{ //src.arrays[src_c]!=null if(dst.arrays[dst_c]==null){dst.set(dst_b,(byte)-1);} System.arraycopy(src.arrays[src_c],src_r,dst.arrays[dst_c],dst_r,l); }//if//---DEBUG ONLY if(DEBUG>0){ final int src_c_2=e/src.block_size; final int dst_c_2=(e+d)/dst.block_size; if(src_c!=src_c_2){System.out.println("dynamic_array: internal error #1");} if(dst_c!=dst_c_2){System.out.println("dynamic_array: internal error #1");} }//if(DEBUG>0) //--------- }//for }else{ //slower algorithm with no System.arrycopy using //FAST==false final int A,B,C; if(srcoff<dstoff){ //������ ������ A=len-1;B=0;C=-1; }else{ //����� ������� A=0;B=len-1;C=1; }//if for(int q=A;(C>0?q<=B:q>=B);q=q+C){ //for(int q=0;q<len;++q) { final int nsrc=srcoff+q; final int csrc=nsrc/src.block_size; final int rsrc=nsrc%src.block_size; final int ndst=dstoff+q; final int cdst=ndst/dst.block_size; final int rdst=ndst%dst.block_size; if(src.arrays[csrc]==null){ if(dst.arrays[cdst]!=null){ dst.set(ndst,(byte)0); }//if }else{ if(dst.arrays[cdst]!=null){ dst.set(ndst,src.get(nsrc)); }else if(src.get(nsrc)!=0){ dst.set(ndst,src.get(nsrc)); }//if...else if ... }//if //dst.set(ndst,src.get(nsrc)); }//for }//if(FAST) } public static final void Copy(byte[] src,int srcoff, byte_array dst, int dstoff, int len){ if(FAST){ //FAST==true Vector spl = new Vector(); final int d=dstoff-srcoff; final int end=srcoff+len; //��� ������������ � �������� � "������� ���������" //������� ��������� int pd=(dstoff/dst.block_size)*dst.block_size - d; pd=pd+dst.block_size; spl.addElement(new Integer(srcoff)); while(pd<end){ final int last=elem(spl.size()-1,spl); if(last<pd){spl.addElement(new Integer(pd));} pd=pd+dst.block_size; }//wihile spl.addElement(new Integer(end)); for(int i=0;i<spl.size()-1;++i){ final int b=((Integer)spl.elementAt(i)).intValue(); final int e=((Integer)spl.elementAt(i+1)).intValue()-1; final int l=e-b+1; final int dst_b=b+d; final int dst_c=(dst_b)/dst.block_size; final int dst_r=(dst_b)%dst.block_size; if(dst.arrays[dst_c]==null){dst.set(dst_b,(byte)-1);} System.arraycopy(src,b,dst.arrays[dst_c],dst_r,l); }//for }else{ //FAST==false for(int q=0;q<len;++q) { final int nsrc=srcoff+q; final int ndst=dstoff+q; dst.set(ndst,src[nsrc]); }//for }//if(FAST) } public static final void Copy(byte_array src,int srcoff, byte[] dst, int dstoff, int len){ //FAST==true if(FAST){ Vector spl = new Vector(); final int d=dstoff-srcoff; final int end=srcoff+len; int ps=(srcoff/src.block_size)*src.block_size; ps=ps+src.block_size; spl.addElement(new Integer(srcoff)); while(ps<end){ final int last=elem(spl.size()-1,spl); if(last<ps){spl.addElement(new Integer(ps));} ps=ps+src.block_size; }//wihile spl.addElement(new Integer(end)); for(int i=0;i<spl.size()-1;++i){ int b=((Integer)spl.elementAt(i)).intValue(); int e=((Integer)spl.elementAt(i+1)).intValue()-1; int l=e-b+1; final int src_c=b/src.block_size; final int src_r=b%src.block_size; final int dst_b=b+d; if(src.arrays[src_c]!=null){ System.arraycopy(src.arrays[src_c],src_r,dst,dst_b,l); }else{ clear(dst,dst_b,l); }//if }//for }else{ //FAST=false for(int q=0;q<len;++q) { final int nsrc=srcoff+q; final int ndst=dstoff+q; dst[ndst]=src.get(nsrc); }//for }//if(FAST) } *///-------------------------------------------------------- private static final void clear(byte[] a, int off, int len) { //System.out.println("fill in array with "+len+" zeros"); if (FAST) { //FAST==true byte[] bb = new byte[Math.min(50, a.length)]; final int c = a.length / bb.length; for (int i = 0; i <= c; ++i) { final int off1 = off + c * bb.length; if (off1 < a.length) { System.arraycopy(bb, 0, a, off1, Math.min(bb.length, a.length - off1)); } }//for } else { //FAST==false for (int i = off; i < off + len; ++i) { a[i] = (byte) 0; }//for }//if(FAST) }//-------------------------------------------------------- private static final int elem(int n, Vector vec) { return ((Integer) vec.elementAt(n)).intValue(); }//-------------------------------------------------------- // protected void finalize(){ // System.out.println("Dynamic array of byte "+name+" used "+totalAllocated()+" of "+length()+" allocated ("+(totalAllocated()*100/length())+"%)"); // }//======================================================== /* public static void main(String[] args){ byte_array src = new byte_array(100,3); byte_array dst = new byte_array(100,4); int srcoff=3; int dstoff=3; int len=9; byte_array.Copy(src,srcoff, dst,dstoff,len); final int n=65536; byte_array array = new byte_array(n); for(int i=0;i<n;++i){ byte q=(byte)i; array.set(i,q); if(q!=array.get(i)){ System.out.print(i+": "); System.out.println(" error "+q+"!="+array.get(i)); System.out.println(); } }//for for(int i=0;i<n;++i){ byte q=(byte)i; if(q!=array.get(i)){ System.out.print(i+": "); System.out.println(" error "+q+"!="+array.get(i)); System.out.println(); } }//for } */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -