/*
 * MtxOutStream.cpp
 *
 *  Created on: Feb 15, 2012
 *      Author: godin
 */

#include "MtxOutStream.h"

MtxOutStream::MtxOutStream( const char* filename )
    : FileOutStream( filename, false )
{}

MtxOutStream::~MtxOutStream() {}

bool MtxOutStream::write( const Mtx& mtx, Logger& logger,
                          int minM, int maxM, int minN, int maxN,
                          Syslog::Severity severity )
{
    bool ok( true );
    minM = minM >= 0 ? minM : mtx.getM() + minM;
    maxM = maxM >= 0 ? maxM : mtx.getM() + maxM;
    minN = minN >= 0 ? minN : mtx.getN() + minN;
    maxN = maxN >= 0 ? maxN : mtx.getN() + maxN;
    int m = maxM - minM + 1;
    int n = maxN - minN + 1;
    ok = m >= 0 && n >= 0;
    ok &= writeInt( m ).bytesWritten() == 4;
    if( ok )
    {
        if( mtx.isUnlimitedN() )
        {
            ok &= writeInt( -1 ).bytesWritten() == 4;
        }
        else
        {
            ok &= writeInt( n ).bytesWritten() == 4;
        }
    }
    if( ok )
    {
        for( int j = 0; ok && j < n; ++j )
        {
            for( int i = 0; ok && i < m; ++i )
            {
                ok &= writeFloat( mtx( i + minM, j + minN ) ).bytesWritten() == 4;
            }
        }
        if( ok )
        {
            //printf( "Write %dx%d matrix at %s\n", m, n, getName() );
            return ok;
        }
    }
    logger.syslog( "Failed to write data from ", getName(), severity );
    return ok;
}
