Regards, Heijden

If there is no other solution, the private fields can be accessed using reflection (see java.lang.reflect.AccessibleObject). This feature is implemented in JamVm + Classpath long time ago. We cannot make the field public or protected. However do measure the performance, probably you do not get any bigger benefits when doing this.

Audrius.

Eric Blake wrote:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Please post to a public mailing list instead of private developers'
addresses (I no longer have time to actively contribute to classpath).

According to R.T.J.M. van der Heijden on 3/27/2006 7:42 AM:
Dear Tom and Eric,

I found your e-mail addresses in the source code of a Java class
'BitSet'. For a software project, I want an efficient implementation
that counts the number of bits that overlap (intersect) between sets. Of
course, I can create a new set as being the intersection between the two
sets and then determine the cardinality of that. After the count is
available, the newly created intersecting set becomes garbage. However,
it could be much more efficient to calculate and return the overlap
directly by accessing the bits variable in both sets (I give a possible
implementation below). Unfortunately, this is not possible because the
'bits' variable is private in BitSet.

Considering the above, I would suggest to set the accessibility of the
'bits' variable to 'protected', or to add some kind of overlap-counter.
Having 'bits' set to 'protected' allows more extensions, of course.

Sorry, but Classpath strives for compatibility with the Sun
specifications, which will not permit making fields publicly accessible
that are not documented as such.

However,
I think you might have other suggestions on how to solve this problem.

I would be glad to hear from you.

Best regards,

Rene van der Heijden



///////////////////////////////////////////////////////////////////////////////////////////

// The following is a suggested part of an extension of BitSet, or part
of BitSet itself //
///////////////////////////////////////////////////////////////////////////////////////////


int countOverlap(BitSet OtherSet)
// counts the number of bits in the intersection of This and the
OtherSet without intervenence of a new set
{
   // determine the length to test
   int n = Math.min(bits.length,OtherSet.bits.length);
   // count the overlap; taken from the implementation of cardinality
   int overlap = 0;
   for (int i = n - 1; i >= 0; i--)
   {
       long a = bits[i] & OtherSet.bits[i];
       // Take care of common cases.
       if (a == 0)
           continue;
       if (a == -1)
       {
           overlap += 64;
           continue;
       }
       // Successively collapse alternating bit groups into a sum.
       a = ((a >> 1) & 0x5555555555555555L) + (a & 0x5555555555555555L);
       a = ((a >> 2) & 0x3333333333333333L) + (a & 0x3333333333333333L);
       int b = (int) ((a >>> 32) + a);
       b = ((b >> 4) & 0x0f0f0f0f) + (b & 0x0f0f0f0f);
       b = ((b >> 8) & 0x00ff00ff) + (b & 0x00ff00ff);
       overlap += ((b >> 16) & 0x0000ffff) + (b & 0x0000ffff);
   }
   return overlap;
}




A good garbage collector recognizes temporary objects that are created for
a single use, and then discarded.  I doubt adding a method will buy you
much improvement.

- --
Life is short - so eat dessert first!

Eric Blake             [EMAIL PROTECTED]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.1 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFEJ/uC84KuGfSFAYARApNOAKDMbxNTxx+KSqoG3iuJLbp83ERvnwCgiHmF
UH6/WwVtUYWRFGEux+SYDJ0=
=y6mw
-----END PGP SIGNATURE-----




  • Re: BitSet Eric Blake
    • Re: BitSet:Use java.lang.reflect.AccessibleObject. Audrius Meskauskas

Reply via email to