package chapter15;
public interface Generator<T> {
T next();
}
package chapter16;
import chapter15.Generator;
public class CountingGenerator {
public static class Boolean implements Generator<java.lang.Boolean>{
private boolean value = false;
@Override
public java.lang.Boolean next() {
value = !value;
return value;
}
}
public static class Byte implements Generator<java.lang.Byte>{
private byte value = 0;
@Override
public java.lang.Byte next() {
return value++;
}
}
static char[] chars = ("abcdefghijklmnopqrestuvwxyz"
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
public static class Character implements Generator<java.lang.Character>{
private int index = -1;
@Override
public java.lang.Character next(){
index = (index +1) % chars.length;
return chars[index];
}
}
public static class String implements Generator<java.lang.String>{
private int length = 7;
Generator<java.lang.Character> cg = new Character();
public String(){}
public String(int length){this.length = length;}
@Override
public java.lang.String next(){
char[] buf = new char[length];
for(int i = 0;i<length;i++){
buf[i] = cg.next();
}
return new java.lang.String(buf);
}
public static class Short implements Generator<java.lang.Short>{
private short value = 0;
@Override
public java.lang.Short next(){
return value++;
}
}
public static class Integer implements Generator<java.lang.Integer>{
private int value = 0;
@Override
public java.lang.Integer next(){
return value++;
}
}
public static class Float implements Generator<java.lang.Float>{
private float value = 0;
public java.lang.Float next(){
float result = value;
value+= 1.0;
return result;
}
}
public static class Long implements Generator<java.lang.Long>{
private long value = 0;
public java.lang.Long next(){
return value++;
}
}
public static class Double implements Generator<java.lang.Double>{
private double value = 0;
public java.lang.Double next(){
double result = value;
value +=1.0;
return value;
}
}
}
}
package chapter16;
import chapter15.Generator;
public class GeneratorTest {
public static int size = 10;
public static void test(Class<?> surroundingClass){
for(Class<?> type : surroundingClass.getClasses()){
System.out.print(type.getSimpleName() +": ");
try{
Generator<?> g = (Generator<?>)type.newInstance();
for(int i = 0;i<size;i++){
System.out.print(g.next() +" ");
}
System.out.println();
} catch(Exception e){
throw new RuntimeException(e);
}
}
}
public static void main(String[] args){
test(CountingGenerator.class);
}
}
package chapter16;
import java.util.Random;
import chapter15.Generator;
import chapter16.CountingGenerator.Character;
public class RandomGenerator {
private static Random r = new Random();
public static class Boolean implements Generator<java.lang.Boolean>{
@Override
public java.lang.Boolean next() {
return r.nextBoolean();
}
}
public static class Byte implements Generator<java.lang.Byte>{
@Override
public java.lang.Byte next() {
return (byte) r.nextInt();
}
}
public static class Character implements Generator<java.lang.Character>{
@Override
public java.lang.Character next(){
return CountingGenerator.chars[r.nextInt(CountingGenerator.chars.length)];
}
}
public static class String extends CountingGenerator.String{
{ cg = new Character();}
public String(){}
public String(int length){ super(length);};
}
public static class Short implements Generator<java.lang.Short>{
@Override
public java.lang.Short next(){
return (short)r.nextInt();
}
}
public static class Integer implements Generator<java.lang.Integer>{
private int mod = 10000;
public Integer(){}
public Integer(int modulo){
mod = modulo;
}
@Override
public java.lang.Integer next(){
return r.nextInt(mod);
}
}
public static class Float implements Generator<java.lang.Float>{
public java.lang.Float next(){
int trimmed = Math.round(r.nextFloat() * 100);
return ((float) trimmed) / 100;
}
}
public static class Long implements Generator<java.lang.Long>{
private int mod = 10000;
public Long(){};
public Long(int modulo){
mod = modulo;
}
public java.lang.Long next(){
return new java.lang.Long(r.nextInt(mod));
}
}
public static class Double implements Generator<java.lang.Double>{
public java.lang.Double next(){
long trimmed = Math.round(r.nextDouble() * 100);
return ((double)trimmed)/100;
}
}
}
package chapter16;
import java.util.Random;
public class RandomGeneratorTest {
public static void main(String[] args){
GeneratorTest.test(RandomGenerator.class);
}
}
package chapter15;public interface Generator { T next();}package chapter16;import chapter15.Generator;public class CountingGenerator { public static class Boolean implements Generator{