Hello.
>>>> [...]
> >>>
> >>>>
> >>>> 2. Add a method BitSet<T> getSupport() to the RandomSource enum, where T
> >>>> is an enum that can be expanded as more features are added. Initially is
> >>>> would be:
> >>>
> >>> +1
> >>> With "EnumSet", I guess.
> >>
> >> Yes.
> >>
> >>>
> >>>>
> >>>> enum RandomSourceSupport {
> >>>> /** The source supported the {@link JumpableUniformRandomProvider}
> >>>> interface. */
> >>>> JUMPABLE,
> >>>> /** The source supported the {@link
> >>>> LongJumpableUniformRandomProvider}
> >>>> interface. */
> >>>> LONG_JUMPABLE,
> >>>> }
> >>>
> >>> +1
> >>>
> >>>>
> >>>> Currently the RandomSource only has a isNativeSeed(Object) method. So
> >>>> adding methods does add API clutter. It would be possible to also add
> >>>> getNativeSeedLength() method as this information (available in the
> >>>> javadoc) is now available in the factory code that builds generators.
> >>>
> >>> +1
> >>
> >>
> >> So this would add to RandomSource:
> >>
> >> int getSeedByteLength()
> >> EnumSet<RandomSourceSupport> getSupport()
> >
> > I think that the API should not specify the type of "Set".
> > Also, the enum should be an inner class. Thus:
> >
> > public class RandomSource {
> > // ...
> >
> > public enum Support {
> > JUMPABLE,
> > // etc.
> > }
> >
> > public Set<Support> getSupport() {
> > final Set<Support> s = new EnumSet<>(Support.class);
> >
> > // ...
> >
> > return s;
> > }
> > }
>
> On reflection I think the use of Set<Enum> is not the best choice. Currently
> we are only wanting to support the question of if this is possible:
>
> (JumpableUniformRandomProvider) RandomSource.create(…)
> (LongJumpableUniformRandomProvider) RandomSource.create(…)
>
> The use of an enum is not a good fit here as any LongJumpable is also a
> Jumpable due to the inheritance hierarchy. So the set of an enum that
> specifies one or the other or both can be incorrectly used to be LongJumpable
> but not Jumpable.
I'm not sure I follow: "incorrectly used" by who?
The library will return a consistent set (if it contains "LONG_JUMPABLE",
it will also contain "JUMPABLE").
>
> Plus it would require returning a copy of the set for each invocation to get
> the supported functionality.
Is that a problem?
[Assuming this is setup/one time initialization of an RNG.]
> And either storing the set per enum value or computing is dynamically which
> is possible...
Yes; an implementation detail.
>
> So perhaps a method that is the inverse of the Class::isAssignableFrom
> method. Since the RandomSourceInternal knows the RNG class this can be
> implemented as:
>
> /**
> * Determines if the class represented by this random source is either the
> same
> * as, or is a subclass or subinterface of, the class or interface represented
> * by the specified {@code Class} parameter. It returns true if so; otherwise
> it returns
> * false.
> *
> * @param type the {@code Class} object to be checked
> * @return the boolean value indicating whether the class of this random
> source
> * can be assigned to objects of the specified type
> */
> public boolean isAssignableTo(Class<?> type) {
> return type.isAssignableFrom(internalIdentifier.getRng());
> }
>
> Allowing:
>
> RandomSource source = ...
> If (source.isAssignableTo(JumpableUniformRandomProvider.class) {
> (JumpableUniformRandomProvider) RandomSource.create(source);
> } else {
> // fail ...
> }
Then, what have you gained over "instanceof"?
Yes, it will avoid an instantiation; but the price seems to be an ugly API
(IMHO).
>
> This option is actually the easiest to implement and if more interfaces are
> added later then nothing needs to be done since it is self-detecting.
Yes, but then I'd keep that for the internal implementation of "support":
public enum RandomSource {
// ...
public boolean isLongJumpable() {
return isAssignableTo(LongJumpableUniformRandomProvider.class);
}
private boolean isAssignableTo(Class<?> type) {
return type.isAssignableFrom(internalIdentifier.getRng());
}
}
Do you foresee many other "properties" that would warrant sparing
a trivial method for each?
Gilles
> >
> >>
> >> The first should return the native seed size in bytes. Currently the
> >> javadoc
> >> contains the native seed length. This is the length of the seed array or 1
> >> if the seed is a Long/Integer.
> >>
> >> I think having the seed size in bytes is more generic and it doesn’t matter
> >> if the seed is an array or not. So perhaps the javadoc should contain the
> >> human readable array length (if relevant) but the code uses the generic
> >> byte
> >> length allowing:
> >
> > +1
> >
> >>
> >> SecureRandom sr = new SecureRandom();
> >> RandomSource source = RandomSource.MWC_256;
> >> UniformRandomProvider rng = RandomSource.create(source,
> >> sr.generateSeed(source.getSeedByteLength());
> >>
> >> In the case where the seed is a Long/Integer I suggest dropping the
> >> javadoc:
> >> "Native seed size: 1” as it is redundant.
> >
> > +1
> >
> > Regards,
> > Gilles
> >
> >>>
> >>>>
> >>>> Any other suggestions?
> >>>>
> >>>> Alex
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]