// 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 java.util.AbstractSet;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import com.tomgibara.bits.ImmutableBit.ImmutableOne;
import com.tomgibara.bits.ImmutableBit.ImmutableZero;
		}

		// mutable methods

		@Override
		public BitStore mutableCopy() {
			return Bits.store(size);
		}

	}

	private class AllMatches implements BitMatches {

		@Override
		public BitMatches disjoint() {
			return this;
		}

		@Override
		public BitMatches overlapping() {
			return this;
		}

		@Override
		public BitStore store() {
			return ImmutableBits.this;
		}

		@Override
		public BitStore sequence() {
// 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/ImmutableBits.java
import java.util.AbstractSet;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import com.tomgibara.bits.ImmutableBit.ImmutableOne;
import com.tomgibara.bits.ImmutableBit.ImmutableZero;

		}

		// mutable methods

		@Override
		public BitStore mutableCopy() {
			return Bits.store(size);
		}

	}

	private class AllMatches implements BitMatches {

		@Override
		public BitMatches disjoint() {
			return this;
		}

		@Override
		public BitMatches overlapping() {
			return this;
		}

		@Override
		public BitStore store() {
			return ImmutableBits.this;
		}

		@Override
		public BitStore sequence() {
			return ones ? ImmutableOne.INSTANCE : ImmutableZero.INSTANCE;