// all sizes+addresses are in ints (4 bytes) sclass ManagedIntObjects_v1 { int[] mem = new int[0]; new FreeList freeList; void ensureCapacity(int size) { if (memorySize() < size) setMemorySize(roundUpToPowerOfTwo(size)); } int memorySize() { ret mem.length; } void setMemorySize(int newSize) { int size = memorySize(); if (newSize < size) unimplemented("Shrinking memory"); freeList.add(IntRange(size, newSize)); mem = resizeIntArray(mem, newSize); } void growMemory() { setMemorySize(memorySize()*2); } int alloc(int length) { IntRange r; while ((r = freeList.findFreeSpace(length)) == null) growMemory(); freeList.remove(IntRange(r.start+length, r.end)); ret r.start; } void free(int start, int length) { freeList.add(IntRange(start, start+length)); } int get(int i) { ret mem[i]; } void set(int i, int val) { mem[i] = val; } // words a pointer requires int sizeOfPointer() { ret 1; } }