123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2011 by Jonas Maebe,
- members of the Free Pascal development team.
- This file implements support infrastructure for sets under the JVM
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- function FpcBitSet.clone: JLObject;
- begin
- result:=inherited;
- end;
- function FpcBitSet.add(elem: jint): FpcBitSet;
- begin
- &set(elem);
- result:=self;
- end;
- function FpcBitSet.addAll(s: FpcBitSet): FpcBitSet;
- begin
- &or(s);
- result:=self;
- end;
- function FpcBitSet.remove(elem: jint): FpcBitSet;
- begin
- clear(elem);
- result:=self;
- end;
- function FpcBitSet.removeAll(s: FpcBitSet): FpcBitSet;
- begin
- andnot(s);
- result:=self;
- end;
- function FpcBitSet.retainAll(s: FpcBitSet): FpcBitSet;
- begin
- &and(s);
- result:=self;
- end;
- function FpcBitSet.contains(elem: jint): boolean;
- begin
- result:=get(elem);
- end;
- function FpcBitSet.containsAll(s: FpcBitSet): boolean;
- var
- tmp: FpcBitSet;
- begin
- tmp:=FpcBitSet(clone);
- tmp.&and(s);
- result:=tmp.equals(s);
- end;
- function FpcBitSet.symdif(s: FpcBitSet): FpcBitSet;
- begin
- s.&xor(s);
- result:=self;
- end;
- class function FpcBitSet.range(start, stop: jint): FpcBitSet;
- begin
- result:=FpcBitSet.create(stop);
- result.&set(start,stop+1);
- end;
- class function FpcBitSet.&of(elem: jint): FpcBitSet;
- begin
- result:=FpcBitSet.create(elem);
- result.&set(elem);
- end;
- procedure fpc_bitset_copy(const src: FpcBitSet; dst: FpcBitSet); compilerproc;
- begin
- dst.clear();
- dst.&or(src);
- end;
- procedure fpc_enumset_copy(const src: JUEnumSet; dst: JUEnumSet); compilerproc;
- begin
- dst.clear();
- dst.addAll(src);
- end;
- function fpc_enumset_symdif(const set1, set2: JUEnumSet): JUEnumSet; compilerproc;
- var
- tmp: JUEnumSet;
- begin
- { (set1 + set 2) - (set1 * set2) }
- result:=JUEnumSet(set1.clone);
- result.addAll(set2);
- tmp:=JUEnumSet(set1.clone);
- tmp.retainAll(set2);
- result.removeAll(tmp);
- end;
- function fpc_bitset_from_string(const s: unicodestring): FpcBitSet; compilerproc;
- var
- i, bits: longint;
- wc: word;
- begin
- { all bits are encoded in the string characters }
- result:=FpcBitSet.Create(cardinal(length(s)+15) div 16);
- for i:=1 to length(s) do
- begin
- wc:=word(s[i]);
- if wc=0 then
- continue;
- for bits:=15 downto 0 do
- if (wc and (1 shl bits)) <> 0 then
- result.&set((i-1)*16+15-bits);
- end;
- end;
- function fpc_enumset_from_string(dummy: FpcEnumValueObtainable; const s: unicodestring): JUEnumSet; compilerproc;
- var
- i, bits: longint;
- wc: word;
- begin
- { all bits are encoded in the string characters }
- result:=JUEnumSet.noneOf(JLObject(dummy).getClass);
- for i:=1 to length(s) do
- begin
- wc:=word(s[i]);
- if wc=0 then
- continue;
- for bits:=15 downto 0 do
- if (wc and (1 shl bits)) <> 0 then
- result.add(dummy.fpcGenericValueOf((i-1)*16+15-bits));
- end;
- end;
- function fpc_enumset_to_int(const s: JUEnumSet; setbase, setsize: longint): jint; compilerproc;
- var
- it: JUIterator;
- ele: FpcEnumValueObtainable;
- val: longint;
- begin
- it:=s.iterator;
- result:=0;
- setsize:=setsize*8;
- while it.hasNext do
- begin
- ele:=FpcEnumValueObtainable(it.next);
- val:=ele.fpcOrdinal-setbase;
- result:=result or (1 shl (setsize-val));
- end;
- end;
- function fpc_enumset_to_long(const s: JUEnumSet; setbase, setsize: longint): jlong; compilerproc;
- var
- it: JUIterator;
- ele: FpcEnumValueObtainable;
- val: longint;
- begin
- it:=s.iterator;
- result:=0;
- setsize:=setsize*8;
- while it.hasNext do
- begin
- ele:=FpcEnumValueObtainable(it.next);
- val:=ele.fpcOrdinal-setbase;
- result:=result or (1 shl (setsize-val));
- end;
- end;
- function fpc_bitset_to_int(const s: FpcBitSet; setbase, setsize: longint): jint; compilerproc;
- var
- i, val: longint;
- begin
- result:=0;
- setsize:=setsize*8;
- i:=s.nextSetBit(0);
- while i>=0 do
- begin
- val:=i-setbase;
- result:=result or (1 shl (setsize-val));
- i:=s.nextSetBit(i+1);
- end;
- end;
- function fpc_bitset_to_long(const s: FpcBitSet; setbase, setsize: longint): jlong; compilerproc;
- var
- i, val: longint;
- begin
- result:=0;
- setsize:=setsize*8;
- i:=s.nextSetBit(0);
- while i>=0 do
- begin
- val:=i-setbase;
- result:=result or (1 shl (setsize-val));
- i:=s.nextSetBit(i+1);
- end;
- end;
- function fpc_int_to_bitset(const val: jint; setbase, setsize: jint): FpcBitSet; compilerproc;
- var
- i, setval: jint;
- begin
- result:=FpcBitSet.create;
- if val<>0 then
- begin
- setsize:=setsize*8;
- for i:=0 to setsize-1 do
- if (val and (jint(1) shl (setsize-i)))<>0 then
- result.&set(i+setbase);
- end;
- end;
- function fpc_long_to_bitset(const val: jint; setbase, setsize: jint): FpcBitSet; compilerproc;
- var
- i, setval: jint;
- begin
- result:=FpcBitSet.create;
- if val<>0 then
- begin
- setsize:=setsize*8;
- for i:=0 to setsize-1 do
- if (val and (jlong(1) shl (setsize-i)))<>0 then
- result.&set(i+setbase);
- end;
- end;
- function fpc_enumset_to_bitset(const val: JUEnumSet; fromsetbase, tosetbase: jint): FpcBitSet; compilerproc;
- var
- it: JUIterator;
- ele: FpcEnumValueObtainable;
- i: longint;
- begin
- result:=FpcBitSet.Create;
- it:=val.iterator;
- while it.hasNext do
- begin
- ele:=FpcEnumValueObtainable(it.next);
- i:=ele.fpcOrdinal-fromsetbase;
- result.&set(i+tosetbase);
- end;
- end;
- function fpc_bitset_to_bitset(const s: FpcBitSet; fromsetbase, tosetbase: jint): FpcBitSet; compilerproc;
- var
- i, val: longint;
- begin
- result:=FpcBitSet.create;
- i:=s.nextSetBit(0);
- while i>=0 do
- begin
- val:=i-fromsetbase;
- result.&set(val+tosetbase);
- i:=s.nextSetBit(i+1);
- end;
- end;
|