// Path: src/main/java/com/tomgibara/bits/Bits.java
// static void checkBitsLength(int length) {
// 	if (length < 0) throw new IllegalArgumentException("negative length");
// 	if (length > 64) throw new IllegalArgumentException("length exceeds 64");
// }
// 
// Path: src/main/java/com/tomgibara/bits/Bits.java
// static void checkIntBitsLength(int length) {
// 	if (length < 0) throw new IllegalArgumentException("negative length");
// 	if (length > 32) throw new IllegalArgumentException("length exceeds 32");
// }
// 
// Path: src/main/java/com/tomgibara/bits/ImmutableBit.java
// static final class ImmutableOne extends ImmutableBit {
// 
// 	static final ImmutableOne INSTANCE = new ImmutableOne();
// 
// 	// fundamental methods
// 
// 	@Override
// 	public boolean getBit(int index) {
// 		checkIndex(index);
// 		return true;
// 	}
// 
// 	// accelerating methods
// 
// 	@Override
// 	public long getBits(int position, int length) {
// 		return getBitsAsInt(position, length);
// 	}
// 
// 	@Override
// 	public int getBitsAsInt(int position, int length) {
// 		switch (position) {
// 		case 0:
// 			switch (length) {
// 			case 0: return 0;
// 			case 1: return 1;
// 			}
// 			break;
// 		case 1:
// 			if (length == 0) return 0;
// 			break;
// 		}
// 		throw new IllegalArgumentException("invalid position and/or length");
// 	}
// 
// 	// comparable methods
// 
// 	@Override
// 	public int compareNumericallyTo(BitStore that) {
// 		int p = that.ones().last();
// 		switch (p) {
// 		case -1 : return  1;
// 		case  0 : return  0;
// 		default : return -1;
// 		}
// 	}
// 
// 	// view methods
// 
// 	@Override
// 	public BitStore flipped() {
// 		return ImmutableZero.INSTANCE;
// 	}
// 
// 	// package scoped methods
// 
// 	@Override
// 	boolean getBit() {
// 		return true;
// 	}
// 
// }
// 
// Path: src/main/java/com/tomgibara/bits/ImmutableBit.java
// static final class ImmutableZero extends ImmutableBit {
// 
// 	static final ImmutableZero INSTANCE = new ImmutableZero();
// 
// 	// fundamental methods
// 
// 	@Override
// 	public boolean getBit(int index) {
// 		checkIndex(index);
// 		return false;
// 	}
// 
// 	// accelerating methods
// 
// 	@Override
// 	public long getBits(int position, int length) {
// 		return getBitsAsInt(position, length);
// 	}
// 
// 	@Override
// 	public int getBitsAsInt(int position, int length) {
// 		if (position == 0 && (length == 0 || length == 1) || position == 0 && length == 0) return 0;
// 		throw new IllegalArgumentException("invalid position and/or length");
// 	}
// 
// 	// view methods
// 
// 	@Override
// 	public BitStore flipped() {
// 		return ImmutableOne.INSTANCE;
// 	}
// 
// 	// comparable methods
// 
// 	@Override
// 	public int compareNumericallyTo(BitStore that) {
// 		return that.zeros().isAll() ? 0 : -1;
// 	}
// 
// 	@Override
// 	boolean getBit() {
// 		return false;
// 	}
// 
// }


import static com.tomgibara.bits.Bits.checkBitsLength;
import static com.tomgibara.bits.Bits.checkIntBitsLength;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectStreamException;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigInteger;
import java.security.PrivilegedAction;
import java.util.AbstractList;
import java.util.AbstractSet;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.SortedSet;
import com.tomgibara.bits.ImmutableBit.ImmutableOne;
import com.tomgibara.bits.ImmutableBit.ImmutableZero;
import com.tomgibara.fundament.Alignable;
import com.tomgibara.streams.ReadStream;
import com.tomgibara.streams.WriteStream;

		@Override
		public void withStore(BitStore store) {
			perform(XOR, store);
		}

		@Override
		public void withStore(int position, BitStore store) {
			perform(XOR, position, store);
		}

		@Override
		public void withBytes(int position, byte[] bytes, int offset, int length) {
			perform(XOR, position, bytes, offset, length);
		}

		@Override
		public BitWriter openWriter(int finalPos, int initialPos) {
			return BitVector.this.openWriter(XOR, finalPos, initialPos);
		}
	}

	private final class MatchesOnes extends AbstractBitMatches {

		@Override
		public boolean bit() {
			return true;
		}

		@Override
// Path: src/main/java/com/tomgibara/bits/Bits.java
// static void checkBitsLength(int length) {
// 	if (length < 0) throw new IllegalArgumentException("negative length");
// 	if (length > 64) throw new IllegalArgumentException("length exceeds 64");
// }
// 
// Path: src/main/java/com/tomgibara/bits/Bits.java
// static void checkIntBitsLength(int length) {
// 	if (length < 0) throw new IllegalArgumentException("negative length");
// 	if (length > 32) throw new IllegalArgumentException("length exceeds 32");
// }
// 
// Path: src/main/java/com/tomgibara/bits/ImmutableBit.java
// static final class ImmutableOne extends ImmutableBit {
// 
// 	static final ImmutableOne INSTANCE = new ImmutableOne();
// 
// 	// fundamental methods
// 
// 	@Override
// 	public boolean getBit(int index) {
// 		checkIndex(index);
// 		return true;
// 	}
// 
// 	// accelerating methods
// 
// 	@Override
// 	public long getBits(int position, int length) {
// 		return getBitsAsInt(position, length);
// 	}
// 
// 	@Override
// 	public int getBitsAsInt(int position, int length) {
// 		switch (position) {
// 		case 0:
// 			switch (length) {
// 			case 0: return 0;
// 			case 1: return 1;
// 			}
// 			break;
// 		case 1:
// 			if (length == 0) return 0;
// 			break;
// 		}
// 		throw new IllegalArgumentException("invalid position and/or length");
// 	}
// 
// 	// comparable methods
// 
// 	@Override
// 	public int compareNumericallyTo(BitStore that) {
// 		int p = that.ones().last();
// 		switch (p) {
// 		case -1 : return  1;
// 		case  0 : return  0;
// 		default : return -1;
// 		}
// 	}
// 
// 	// view methods
// 
// 	@Override
// 	public BitStore flipped() {
// 		return ImmutableZero.INSTANCE;
// 	}
// 
// 	// package scoped methods
// 
// 	@Override
// 	boolean getBit() {
// 		return true;
// 	}
// 
// }
// 
// Path: src/main/java/com/tomgibara/bits/ImmutableBit.java
// static final class ImmutableZero extends ImmutableBit {
// 
// 	static final ImmutableZero INSTANCE = new ImmutableZero();
// 
// 	// fundamental methods
// 
// 	@Override
// 	public boolean getBit(int index) {
// 		checkIndex(index);
// 		return false;
// 	}
// 
// 	// accelerating methods
// 
// 	@Override
// 	public long getBits(int position, int length) {
// 		return getBitsAsInt(position, length);
// 	}
// 
// 	@Override
// 	public int getBitsAsInt(int position, int length) {
// 		if (position == 0 && (length == 0 || length == 1) || position == 0 && length == 0) return 0;
// 		throw new IllegalArgumentException("invalid position and/or length");
// 	}
// 
// 	// view methods
// 
// 	@Override
// 	public BitStore flipped() {
// 		return ImmutableOne.INSTANCE;
// 	}
// 
// 	// comparable methods
// 
// 	@Override
// 	public int compareNumericallyTo(BitStore that) {
// 		return that.zeros().isAll() ? 0 : -1;
// 	}
// 
// 	@Override
// 	boolean getBit() {
// 		return false;
// 	}
// 
// }


// Path: src/main/java/com/tomgibara/bits/BitVector.java
import static com.tomgibara.bits.Bits.checkBitsLength;
import static com.tomgibara.bits.Bits.checkIntBitsLength;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectStreamException;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigInteger;
import java.security.PrivilegedAction;
import java.util.AbstractList;
import java.util.AbstractSet;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.SortedSet;
import com.tomgibara.bits.ImmutableBit.ImmutableOne;
import com.tomgibara.bits.ImmutableBit.ImmutableZero;
import com.tomgibara.fundament.Alignable;
import com.tomgibara.streams.ReadStream;
import com.tomgibara.streams.WriteStream;


		@Override
		public void withStore(BitStore store) {
			perform(XOR, store);
		}

		@Override
		public void withStore(int position, BitStore store) {
			perform(XOR, position, store);
		}

		@Override
		public void withBytes(int position, byte[] bytes, int offset, int length) {
			perform(XOR, position, bytes, offset, length);
		}

		@Override
		public BitWriter openWriter(int finalPos, int initialPos) {
			return BitVector.this.openWriter(XOR, finalPos, initialPos);
		}
	}

	private final class MatchesOnes extends AbstractBitMatches {

		@Override
		public boolean bit() {
			return true;
		}

		@Override
		public ImmutableOne sequence() {