Skip to content

Commit

Permalink
Merge pull request #7 from curious-odd-man/#1.Syntax{1,}Support
Browse files Browse the repository at this point in the history
#1. Syntax {1,} support
  • Loading branch information
curious-odd-man committed Dec 2, 2019
2 parents 39ff995 + f2cc417 commit 52050c9
Show file tree
Hide file tree
Showing 16 changed files with 124 additions and 135 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Code:
RgxGen rgxGen = new RgxGen(aRegex); // Create generator
String s = rgxGen.generate(); // Generate new random value
BigInteger estimation = rgxGen.numUnique(); // The estimation (not accurate, see Limitations) how much unique values can be generated with that pattern.
Iterator<String> uniqueStrings = rgxGen.uStream(); // Iterate over unique values (not accurate, see Limitations)
StringIterator uniqueStrings = rgxGen.iterateUnique(); // Iterate over unique values (not accurate, see Limitations)
```

## Supported syntax
Expand All @@ -31,7 +31,7 @@ Iterator<String> uniqueStrings = rgxGen.uStream(); // Iterate over unique v
+ - one or more occurrences
* - zero or more occurrences
\d - a digit. Equivalent to [0-9]
{2} and {1,2} - repeatitions. NOTE {1,} not supported yet
{2} and {1,2} - repeatitions. Use {n,} to repeat at least n times.
[] - single character from ones that are inside brackets. [a-zA-Z] (dash) also supported
() - to group multiple characters for the repetitions
(a|b) - alternatives
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/github/curiousoddman/rgxgen/RgxGen.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import com.github.curiousoddman.rgxgen.generator.visitors.GenerationVisitor;
import com.github.curiousoddman.rgxgen.generator.visitors.UniqueGenerationVisitor;
import com.github.curiousoddman.rgxgen.generator.visitors.UniqueValuesCountingVisitor;
import com.github.curiousoddman.rgxgen.parsing.DefaultTreeBuilder;
import com.github.curiousoddman.rgxgen.iterators.StringIterator;
import com.github.curiousoddman.rgxgen.parsing.dflt.DefaultTreeBuilder;

import java.math.BigInteger;
import java.util.Iterator;
import java.util.stream.Stream;

/**
Expand Down Expand Up @@ -50,7 +50,7 @@ public Stream<String> stream() {
*
* @return stream of unique generated strings
*/
public Iterator<String> iterateUnique() {
public StringIterator iterateUnique() {
UniqueGenerationVisitor ugv = new UniqueGenerationVisitor();
aNode.visit(ugv);
return ugv.getUniqueStrings();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
import com.github.curiousoddman.rgxgen.iterators.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Supplier;

public class UniqueGenerationVisitor implements NodeVisitor {
private List<Supplier<Iterator<String>>> aIterators = new ArrayList<>();
private List<Supplier<StringIterator>> aIterators = new ArrayList<>();

private static Iterator<String> permutationsOrFlat(List<Supplier<Iterator<String>>> itSupp) {
private static StringIterator permutationsOrFlat(List<Supplier<StringIterator>> itSupp) {
if (itSupp.size() == 1) {
return itSupp.get(0)
.get();
Expand All @@ -27,7 +26,7 @@ public void visit(AnySymbol node) {

@Override
public void visit(Choice node) {
List<List<Supplier<Iterator<String>>>> nodeIterators = new ArrayList<>(node.getNodes().length);
List<List<Supplier<StringIterator>>> nodeIterators = new ArrayList<>(node.getNodes().length);
for (Node n : node.getNodes()) {
UniqueGenerationVisitor v = new UniqueGenerationVisitor();
n.visit(v);
Expand All @@ -49,7 +48,7 @@ public void visit(Repeat node) {
node.getNode()
.visit(v);

List<Supplier<Iterator<String>>> iterators = v.aIterators;
List<Supplier<StringIterator>> iterators = v.aIterators;

// (a|b){1} -> "a", "b" --> "a", "b"
// (a|b){2} -> "a", "b" --> "aa", "ab", "ba", "bb"
Expand All @@ -72,7 +71,7 @@ public void visit(Sequence node) {
}
}

public Iterator<String> getUniqueStrings() {
public StringIterator getUniqueStrings() {
return permutationsOrFlat(aIterators);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.github.curiousoddman.rgxgen.iterators;

import java.util.Iterator;
import java.util.NoSuchElementException;

public class ArrayIterator implements Iterator<String> {
public class ArrayIterator extends StringIterator {

private String[] aStrings;
private int aIndex = 0;
Expand All @@ -18,7 +17,7 @@ public boolean hasNext() {
}

@Override
public String next() {
public String nextImpl() {
try {
return aStrings[aIndex++];
} catch (ArrayIndexOutOfBoundsException ignore) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.github.curiousoddman.rgxgen.iterators;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class ChoiceIterator implements Iterator<String> {
private final List<Supplier<Iterator<String>>> aIterators;
public class ChoiceIterator extends StringIterator {
private final List<Supplier<StringIterator>> aIterators;

private Iterator<String> aCurrentIterator;
private StringIterator aCurrentIterator;

public ChoiceIterator(List<List<Supplier<Iterator<String>>>> iterators) {
public ChoiceIterator(List<List<Supplier<StringIterator>>> iterators) {
aIterators = iterators.stream()
.flatMap(v -> v.stream())
.flatMap(Collection::stream)
.collect(Collectors.toList());
aCurrentIterator = aIterators.remove(0)
.get();
Expand All @@ -25,7 +26,7 @@ public boolean hasNext() {
}

@Override
public String next() {
public String nextImpl() {
if (!aCurrentIterator.hasNext()) {
if (aIterators.isEmpty()) {
throw new NoSuchElementException("No more values");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
import java.util.NoSuchElementException;
import java.util.function.Supplier;

public class IncrementalLengthIterator implements Iterator<String> {
private final Supplier<Iterator<String>> aSupplier;
private final int aMax;
public class IncrementalLengthIterator extends StringIterator {
private final Supplier<StringIterator> aSupplier;
private final int aMax;

private int aCurrentLength;
private Iterator<String>[] aCurrentIterators;
private String[] aGeneratedParts;

public IncrementalLengthIterator(Supplier<Iterator<String>> supplier, int min, int max) {
aCurrentLength = min;
public IncrementalLengthIterator(Supplier<StringIterator> supplier, int min, int max) {
aSupplier = supplier;
aCurrentLength = min;
aMax = max;
}

Expand Down Expand Up @@ -43,7 +43,7 @@ private void allocateNewLength() {
}

@Override
public String next() {
public String nextImpl() {
if (aCurrentLength == 0) {
++aCurrentLength;
return "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class PermutationsIterator implements Iterator<String> {
private final List<Supplier<Iterator<String>>> aIteratorsSuppliers;
private final Iterator<String>[] aIterators;
public class PermutationsIterator extends StringIterator {
private final List<Supplier<StringIterator>> aIteratorsSuppliers;
private final StringIterator[] aIterators;
private final String[] aGeneratedParts;

public PermutationsIterator(List<Supplier<Iterator<String>>> iteratorsSuppliers) {
public PermutationsIterator(List<Supplier<StringIterator>> iteratorsSuppliers) {
aIteratorsSuppliers = iteratorsSuppliers;
aIterators = new Iterator[aIteratorsSuppliers.size()];
aIterators = new StringIterator[aIteratorsSuppliers.size()];

aGeneratedParts = new String[aIterators.length];

for (int i = 0; i < aIterators.length; i++) {
Iterator<String> iterator = aIteratorsSuppliers.get(i)
StringIterator iterator = aIteratorsSuppliers.get(i)
.get();
aIterators[i] = iterator;
}
Expand All @@ -32,8 +32,7 @@ public PermutationsIterator(List<Supplier<Iterator<String>>> iteratorsSuppliers)

public PermutationsIterator(int length, String[] values) {
this(IntStream.range(0, length)
.mapToObj(i -> ((Supplier<Iterator<String>>) () -> Arrays.stream(values)
.iterator()))
.mapToObj(i -> ((Supplier<StringIterator>) () -> new ArrayIterator(values)))
.collect(Collectors.toList()));
}

Expand All @@ -44,7 +43,7 @@ public boolean hasNext() {
}

@Override
public String next() {
public String nextImpl() {
// Initialize all value
if (aGeneratedParts[0] == null) {
for (int i = 0; i < aGeneratedParts.length; i++) {
Expand All @@ -60,7 +59,7 @@ public String next() {
// We can only reset other iterators. Head iterator should use all it's values only once
throw new NoSuchElementException("No more unique values");
} else {
Iterator<String> iterator = aIteratorsSuppliers.get(i)
StringIterator iterator = aIteratorsSuppliers.get(i)
.get();
aIterators[i] = iterator;
aGeneratedParts[i] = iterator.next();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.Iterator;

public class SingleValueIterator implements Iterator<String> {
public class SingleValueIterator extends StringIterator {
private String aV;

public SingleValueIterator(String v) {
Expand All @@ -15,7 +15,7 @@ public boolean hasNext() {
}

@Override
public String next() {
public String nextImpl() {
String tmp = aV;
aV = null;
return tmp;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.github.curiousoddman.rgxgen.iterators;

import java.util.Iterator;
import java.util.Objects;

public abstract class StringIterator implements Iterator<String> {

private String aCurrent;

@SuppressWarnings("IteratorNextCanNotThrowNoSuchElementException")
@Override
public String next() {
aCurrent = nextImpl();
Objects.requireNonNull(aCurrent);
return aCurrent;
}

protected abstract String nextImpl();

public String current() {
return aCurrent;
}
}

This file was deleted.

Loading

0 comments on commit 52050c9

Please sign in to comment.