Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
9812b66
optimize hot loops
yuzawa-san Jan 12, 2026
674d03f
clean up mutability collection flow
yuzawa-san Jan 12, 2026
cd9a876
use arrays
yuzawa-san Jan 12, 2026
bf62f5f
clean up dirty flow again
yuzawa-san Jan 12, 2026
56b930e
FixedIntegerList
yuzawa-san Jan 12, 2026
8f80001
avoid itable calls to IntegerSet
yuzawa-san Jan 12, 2026
1515377
update tests
yuzawa-san Jan 13, 2026
74870a8
fixed signed byte int limit
yuzawa-san Jan 13, 2026
92cbd01
javadoc
yuzawa-san Jan 13, 2026
5070310
DirtyableList
yuzawa-san Jan 13, 2026
06f6c28
fix test
yuzawa-san Jan 13, 2026
2b97c41
remove substring
yuzawa-san Jan 15, 2026
3ab0e44
fix tests
yuzawa-san Jan 15, 2026
35ace8d
fix copy
yuzawa-san Jan 16, 2026
ed4581a
own bitset
yuzawa-san Jan 16, 2026
ec6b366
wip
yuzawa-san Jan 16, 2026
c7cc6b6
remove imports
yuzawa-san Jan 16, 2026
22b1caa
style
yuzawa-san Jan 20, 2026
e966b1e
optimize fibonacci
yuzawa-san Jan 27, 2026
3645237
optimize encode
yuzawa-san Jan 27, 2026
b569dff
convert fields to enums
yuzawa-san Jan 21, 2026
af6ab8d
thin segments
yuzawa-san Jan 21, 2026
269e8a5
move
yuzawa-san Jan 21, 2026
61524c4
dry
yuzawa-san Jan 21, 2026
842af42
dry
yuzawa-san Jan 22, 2026
80abb08
use an abstract method
yuzawa-san Jan 22, 2026
e96873e
more dry
yuzawa-san Jan 22, 2026
bbaad3c
more dry
yuzawa-san Jan 22, 2026
900b542
clean up flows
yuzawa-san Jan 23, 2026
09ef2d9
clean up hierarchy
yuzawa-san Jan 23, 2026
b9817bb
style
yuzawa-san Jan 23, 2026
cd9bb63
remove extra class
yuzawa-san Jan 23, 2026
70c65ef
use fieldkey
yuzawa-san Jan 23, 2026
3f5f9c8
toString
yuzawa-san Jan 23, 2026
f9e14b0
user headers to store state
yuzawa-san Jan 24, 2026
7639aaf
clean up registry of sections
yuzawa-san Jan 24, 2026
a9e2109
cleanup
yuzawa-san Jan 24, 2026
14e87ae
notes
yuzawa-san Jan 24, 2026
45f0c2b
use array
yuzawa-san Jan 27, 2026
fba9fbb
cleanup
yuzawa-san Jan 27, 2026
647eb79
another size
yuzawa-san Jan 27, 2026
46843c7
fix sizing
yuzawa-san Jan 28, 2026
e50a578
fix dirty on init
yuzawa-san Jan 28, 2026
1ae9e6d
;
yuzawa-san Jan 28, 2026
4e73663
upgrade slicing methodology to use indexOf
yuzawa-san Jan 28, 2026
f463f6b
substring
yuzawa-san Jan 28, 2026
a8d48c5
clear only if something was there
yuzawa-san Jan 28, 2026
9ea3b08
do base64 in blocks
yuzawa-san Jan 28, 2026
5c1d473
add base 64 test
yuzawa-san Jan 28, 2026
e09b30e
clean up maven configuration
yuzawa-san Jan 29, 2026
7e1a12f
use bit set for fixed list
yuzawa-san Feb 2, 2026
dcd562f
lazy init of collections when decode does slices
yuzawa-san Feb 3, 2026
cc1ebac
make tests pass
yuzawa-san Feb 3, 2026
e0840d0
unify bit string
yuzawa-san Feb 3, 2026
2b17ddd
remove redundant code
yuzawa-san Feb 3, 2026
b785693
consolidate and rename read/write methods
yuzawa-san Feb 3, 2026
c835146
fix packages
yuzawa-san Feb 3, 2026
2638edb
fewer field updates
yuzawa-san Feb 3, 2026
51a08ab
flip byte order
yuzawa-san Feb 3, 2026
9ed3b17
faster numeric decoders
yuzawa-san Feb 3, 2026
adcdb9b
cleanup
yuzawa-san Feb 3, 2026
8df35e0
clean up DataType
yuzawa-san Feb 9, 2026
d3fff8a
unify datatype hierarchy
yuzawa-san Feb 9, 2026
6a11348
migrate to fields
yuzawa-san Feb 10, 2026
8d87d70
fix dynamic sizing
yuzawa-san Feb 10, 2026
10bd6a4
fix tests and cleanup
yuzawa-san Feb 10, 2026
c3fdad4
remove bespoke segments
yuzawa-san Feb 10, 2026
0a1ea09
clean up us hierarchy
yuzawa-san Feb 10, 2026
6e3bb4d
cleanup
yuzawa-san Feb 10, 2026
6be47f5
fix deriveds
yuzawa-san Feb 10, 2026
bff7d39
move name
yuzawa-san Feb 10, 2026
e10dedd
add some tostring
yuzawa-san Feb 10, 2026
c430b5f
presize gpp section map
yuzawa-san Feb 11, 2026
86c27fc
clean up exceptions
yuzawa-san Feb 11, 2026
dd962e9
more clean up
yuzawa-san Feb 11, 2026
f647e9b
test field names to string
yuzawa-san Feb 11, 2026
0a3f100
fix constant names
yuzawa-san Feb 11, 2026
558aaa2
optimize validator
yuzawa-san Feb 11, 2026
1fb8dab
move source and add jacoco
yuzawa-san Feb 11, 2026
ff3f858
use SNAPSHOT instead of RC1
yuzawa-san Feb 19, 2026
620be79
Merge branch '4.X-maven-fixes' of github.com:yuzawa-san/iabgpp-java i…
yuzawa-san Feb 19, 2026
0ff66ac
spotless apply
yuzawa-san Feb 19, 2026
2fd8542
remove useless formatter on/off
yuzawa-san Feb 19, 2026
d3aca85
lazy slicing
yuzawa-san Feb 19, 2026
db1c6a1
add mn
yuzawa-san Feb 19, 2026
7ecbbc7
seamless support usnatv2
yuzawa-san Feb 19, 2026
2f9f831
Merge branch '4.X-mn' into 4.X-perf-optimizations
yuzawa-san Feb 19, 2026
32e3a5f
clean up mn
yuzawa-san Feb 26, 2026
04eb295
clean up support for optional segments
yuzawa-san Mar 26, 2026
d14a86b
tcf 2.3 support
yuzawa-san Mar 26, 2026
ca1ffbd
do not throw exception on contains zero or negative
yuzawa-san Apr 1, 2026
93690f8
add range entry toString
yuzawa-san Apr 1, 2026
1102e11
Update IntegerSetTest.java
yuzawa-san Apr 1, 2026
210e4ae
fix dirty setting
yuzawa-san Apr 2, 2026
1d74ee6
spotless
yuzawa-san Apr 2, 2026
c21e64f
e
yuzawa-san Apr 2, 2026
6ca6d11
clean up toString
yuzawa-san Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.iab.gpp.encoder.bitstring;

import java.util.BitSet;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.error.DecodingException;

Expand Down Expand Up @@ -46,7 +45,7 @@ public static final BitString of(String str) {
}

public IntegerSet toIntegerSet() {
return new IntegerBitSet(bitSet, from, to, 1);
return new IntegerSet(bitSet, from, to, 1);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.iab.gpp.encoder.datatype;

import com.iab.gpp.encoder.datatype.encoder.Dirtyable;

// This class is used to handle collection types.
// It is important that we monitor the collections we return for changes.
public abstract class AbstractDirtyableBitStringDataType<T extends Dirtyable>
extends AbstractEncodableBitStringDataType<T> {

protected AbstractDirtyableBitStringDataType(boolean hardFailIfMissing) {
super(hardFailIfMissing);
}

@Override
public boolean isDirty() {
return super.isDirty() || value.isDirty();
}

@Override
public void setDirty(boolean dirty) {
super.setDirty(dirty);
value.setDirty(dirty);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ public AbstractEncodableBitStringDataType<T> withValidator(Predicate<T> validato
return this;
}

public boolean hasValue() {
public final boolean hasValue() {
return this.value != null;
}

public T getValue() {
public final T getValue() {
return this.value;
}

Expand All @@ -48,7 +48,7 @@ public void setValue(Object value) {

}

public boolean getHardFailIfMissing() {
public final boolean getHardFailIfMissing() {
return this.hardFailIfMissing;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.iab.gpp.encoder.datatype;

public interface DataType<T> {
import com.iab.gpp.encoder.datatype.encoder.Dirtyable;

public interface DataType<T> extends Dirtyable {
boolean hasValue();
T getValue();
void setValue(Object value);
boolean isDirty();
void setDirty(boolean dirty);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.iab.gpp.encoder.datatype;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;

import com.iab.gpp.encoder.bitstring.BitString;
Expand All @@ -12,16 +11,18 @@
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableArrayOfFixedIntegerRanges extends AbstractEncodableBitStringDataType<List<RangeEntry>> {
public final class EncodableArrayOfFixedIntegerRanges extends AbstractDirtyableBitStringDataType<FixedList<RangeEntry>> {

private int keyBitStringLength;
private int typeBitStringLength;

private static final FixedList<RangeEntry> EMPTY = new FixedList<>(List.of());

public EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStringLength, boolean hardFailIfMissing) {
super(hardFailIfMissing);
this.keyBitStringLength = keyBitStringLength;
this.typeBitStringLength = typeBitStringLength;
this.value = Collections.emptyList();
this.value = EMPTY;
}

@Override
Expand All @@ -45,7 +46,7 @@ public void encode(BitStringBuilder sb) {
public void decode(BitString bitString) {
try {
int size = FixedIntegerEncoder.decode(bitString, 0, 12);
List<RangeEntry> entries = new ArrayList<>(size);
RangeEntry[] entries = new RangeEntry[size];
int index = 12;
for (int i = 0; i < size; i++) {
int key = FixedIntegerEncoder.decode(bitString, index, keyBitStringLength);
Expand All @@ -58,11 +59,12 @@ public void decode(BitString bitString) {
IntegerSet ids = FixedIntegerRangeEncoder.decode(substring);
index += substring.length();

entries.add(new RangeEntry(key, type, ids));
RangeEntry entry = new RangeEntry(key, type, ids);
entries[i] = entry;
}

// NOTE: this requires that updates to structure be done using the setter
this.value = Collections.unmodifiableList(entries);
// NOTE: this requires that adding/removing ranges uses the setter
this.value = new FixedList<>(Arrays.asList(entries));
} catch (Exception e) {
throw new DecodingException(e);
}
Expand Down Expand Up @@ -98,4 +100,9 @@ public BitString substring(BitString bitString, int fromIndex) throws SubstringE
}
}

@SuppressWarnings("unchecked")
@Override
public void setValue(Object value) {
super.setValue(new FixedList<>((List<RangeEntry>) value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,18 @@
import java.util.Collection;
import com.iab.gpp.encoder.bitstring.BitString;
import com.iab.gpp.encoder.bitstring.BitStringBuilder;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerEncoder;
import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerRangeEncoder;
import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableFibonacciIntegerRange extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableFibonacciIntegerRange extends AbstractDirtyableBitStringDataType<IntegerSet> {

public EncodableFibonacciIntegerRange() {
super(true);
this.value = new IntegerBitSet();
this.value = new IntegerSet();
}

public void encode(BitStringBuilder builder) {
Expand Down Expand Up @@ -57,9 +56,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@
import java.util.Collection;
import com.iab.gpp.encoder.bitstring.BitString;
import com.iab.gpp.encoder.bitstring.BitStringBuilder;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.FixedBitfieldEncoder;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableFixedBitfield extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableFixedBitfield extends AbstractDirtyableBitStringDataType<IntegerSet> {

private final int numElements;

public EncodableFixedBitfield(int numElements) {
super(true);
this.numElements = numElements;
this.value = new IntegerBitSet(numElements);
this.value = new IntegerSet(numElements);
}

public void encode(BitStringBuilder builder) {
Expand Down Expand Up @@ -49,9 +48,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.iab.gpp.encoder.datatype;

import java.util.ArrayList;
import java.util.List;

import com.iab.gpp.encoder.bitstring.BitString;
Expand All @@ -9,22 +8,16 @@
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableFixedIntegerList extends AbstractEncodableBitStringDataType<List<Integer>> {
public final class EncodableFixedIntegerList extends AbstractDirtyableBitStringDataType<FixedIntegerList> {

private int elementBitStringLength;
private int numElements;

protected EncodableFixedIntegerList(int elementBitStringLength, int numElements) {
public EncodableFixedIntegerList(int elementBitStringLength, int numElements) {
super(true);
this.elementBitStringLength = elementBitStringLength;
this.numElements = numElements;
}

public EncodableFixedIntegerList(int elementBitStringLength, List<Integer> value) {
super(true);
this.elementBitStringLength = elementBitStringLength;
this.numElements = value.size();
setValue(value);
super.setValue(new FixedIntegerList(numElements));
}

public void encode(BitStringBuilder builder) {
Expand All @@ -37,7 +30,7 @@ public void encode(BitStringBuilder builder) {

public void decode(BitString bitString) {
try {
this.value = FixedIntegerListEncoder.decode(bitString, this.elementBitStringLength, this.numElements);
FixedIntegerListEncoder.decode(this.value, bitString, this.elementBitStringLength, this.numElements);
} catch (Exception e) {
throw new DecodingException(e);
}
Expand All @@ -54,18 +47,12 @@ public BitString substring(BitString bitString, int fromIndex) throws SubstringE
@SuppressWarnings("unchecked")
@Override
public void setValue(Object value) {
List<Integer> v = new ArrayList<>((List<Integer>) value);
for (int i = v.size(); i < numElements; i++) {
v.add(0);
List<Integer> list = (List<Integer>) value;
int size = list.size();
for (int i = 0; i < numElements; i++) {
this.value.set(i, i < size ? list.get(i) : 0);
}
if (v.size() > numElements) {
v = v.subList(0, numElements);
}
super.setValue(v);
}

@Override
public List<Integer> getValue() {
return new ManagedFixedList<>(this, super.getValue());
// call validator
super.setValue(this.value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,17 @@
import java.util.Collection;
import com.iab.gpp.encoder.bitstring.BitString;
import com.iab.gpp.encoder.bitstring.BitStringBuilder;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder;
import com.iab.gpp.encoder.datatype.encoder.FixedIntegerRangeEncoder;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableFixedIntegerRange extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableFixedIntegerRange extends AbstractDirtyableBitStringDataType<IntegerSet> {

protected EncodableFixedIntegerRange() {
super(true);
this.value = new IntegerBitSet();
this.value = new IntegerSet();
}

public void encode(BitStringBuilder builder) {
Expand Down Expand Up @@ -56,9 +55,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,19 @@

import com.iab.gpp.encoder.bitstring.BitString;
import com.iab.gpp.encoder.bitstring.BitStringBuilder;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.FixedBitfieldEncoder;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableFlexibleBitfield extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableFlexibleBitfield extends AbstractDirtyableBitStringDataType<IntegerSet> {

private IntSupplier getLengthSupplier;

public EncodableFlexibleBitfield(IntSupplier getLengthSupplier) {
super(true);
this.getLengthSupplier = getLengthSupplier;
this.value = new IntegerBitSet();
this.value = new IntegerSet();
}

public void encode(BitStringBuilder builder) {
Expand Down Expand Up @@ -51,9 +50,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;

public final class EncodableOptimizedFibonacciRange extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableOptimizedFibonacciRange extends AbstractDirtyableBitStringDataType<IntegerSet> {

protected EncodableOptimizedFibonacciRange() {
super(true);
Expand Down Expand Up @@ -64,9 +64,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,18 @@
import java.util.Collection;
import com.iab.gpp.encoder.bitstring.BitString;
import com.iab.gpp.encoder.bitstring.BitStringBuilder;
import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet;
import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder;
import com.iab.gpp.encoder.datatype.encoder.IntegerSet;
import com.iab.gpp.encoder.datatype.encoder.OptimizedFixedRangeEncoder;
import com.iab.gpp.encoder.error.DecodingException;
import com.iab.gpp.encoder.error.EncodingException;


public final class EncodableOptimizedFixedRange extends AbstractEncodableBitStringDataType<IntegerSet> {
public final class EncodableOptimizedFixedRange extends AbstractDirtyableBitStringDataType<IntegerSet> {

public EncodableOptimizedFixedRange() {
super(true);
this.value = new IntegerBitSet();
this.value = new IntegerSet();
}

public void encode(BitStringBuilder builder) {
Expand Down Expand Up @@ -56,9 +55,4 @@ public void setValue(Object value) {
this.value.clear();
this.value.addAll((Collection<Integer>) value);
}

@Override
public IntegerSet getValue() {
return new ManagedIntegerSet(this, super.getValue());
}
}
Loading
Loading