/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.das2.qds;

/**
 * Builder for SparseDataSets.  This was introduced to fix the problem where
 * we wish to calculate the SparseDataSet in one pass, but we can't do this because
 * PyQDataSets obscure the type and there was no way to set the length.
 * 
 * This is also useful for building the BundleDescriptor datasets that describe how to 
 * unpack rank 2 datasets with the BUNDLE_1 property.
 * @author jbf
 */
public class SparseDataSetBuilder {
    
    private SparseDataSet ds;
    
    public SparseDataSetBuilder( int rank ) {
        ds= SparseDataSet.createRank(rank);
    }
    
    public SparseDataSet getDataSet() {
        if ( ds.length0==-1 ) {
            throw new IllegalArgumentException("setLength was never called");
        }
        return ds;
    }

    public void putValue(double d) {
        ds.putValue(d);
    }

    public void putValue(int i0, double d) {
        ds.putValue( i0, d );
    }

    public void putValue(int i0, int i1, double d) {
        ds.putValue( i0, i1, d );
    }

    public void putValue(int i0, int i1, int i2, double d) {
        ds.putValue( i0, i1, i2, d );
    }

    public void putValue(int i0, int i1, int i2, int i3, double d) {
        ds.putValue( i0, i1, i2, i3, d );
    }

    public void putProperty(String name, Object value) {
        SemanticOps.checkPropertyType( name, value, true );
        ds.putProperty( name, value );
    }

    public void putProperty(String name, int index, Object value) {
        SemanticOps.checkPropertyType( name, value, true );
        ds.putProperty( name, index, value );
    }

    /**
     * set the length of the zeroth dimension.  Other dimensions have length set implicitly by the highest value set.
     * If this is not set explicitly, then it will be implicit as well.
     * @param i0
     */
    public void setLength( int i0 ) {
        ds.setLength(i0);
    }
  
    /**
     * make this a qube dataset, where all the lengths are the same.
     * implicitly this calls setLength(qube[0]).
     * @param qube 
     */    
    public void setQube( int[] qube ) {
        ds.setQube(qube);
    }    
    
}