content: /*
   * Copyright (c) 2017, Andreas Fagschlunger. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   *   - Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   *
   *   - Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  package at.o2xfs.win32;
  
  import java.util.ArrayList;
  import java.util.Iterator;
  import java.util.List;
  
  /**
   * <code>ZList</code>
   *
   * A class representing a null-terminated list of pointers.
   *
   * @author Andreas Fagschlunger
   */
  public class ZList extends Type implements Iterable<Pointer> {
  
  	private final List<Pointer> pointers = new ArrayList<Pointer>();
  
  	public <T extends Type> ZList(List<T> types) {
  		for (int i = 0; i < types.size(); i++) {
  			pointers.add(new Pointer());
  		}
  		allocate();
  		int offset = 0;
  		for (int i = 0; i < types.size(); i++) {
  			Pointer p = pointers.get(i);
  			p.assignBuffer(getBuffer().subBuffer(offset, p.getSize()));
  			p.pointTo(types.get(i));
  			offset += p.getSize();
  		}
  	}
  
  	public ZList(Pointer pointer) {
  		int offset = 0;
  		Buffer buffer = null;
  		while (true) {
  			buffer = pointer.buffer(offset + pointer.getSize());
  			Pointer p = new Pointer(buffer.subBuffer(offset, pointer.getSize()));
  			if (Pointer.NULL.equals(p)) {
  				break;
  			}
  			pointers.add(p);
  			offset += p.getSize();
  		}
  		assignBuffer(buffer);
  	}
  
  	@Override
  	public int getSize() {
  		int size = Pointer.NULL.getSize();
  		for (Pointer p : pointers) {
  			size += p.getSize();
  		}
  		return size;
  	}
  
  	@Override
  	public Iterator<Pointer> iterator() {
  		return pointers.iterator();
  	}
  }