/*
 * MtxIOStream.h
 *
 * reads in 2D matrix "mtx" file where first two int32 are the
 * dimensions, and the rest is a column major matrix of
 * single precision.
 *
 *  Created on: Feb 15, 2012
 *      Author: godin
 */

#ifndef MTXIOSTREAM_H_
#define MTXIOSTREAM_H_

#include "FileIOStream.h"
#include "data/Mtx.h"
#include "logger/Logger.h"
#include "logger/Syslog.h"

class MtxIOStream: public FileIOStream
{
public:
    MtxIOStream( const char* filename, bool clobber );
    virtual ~MtxIOStream();

    /// Reads matrix
    /// in case of failure, returns invalid Matrix.
    Mtx read( Logger& logger, int maxN = 0, Syslog::Severity severity = Syslog::FAULT )
    {
        return read( logger, 0, maxN, severity );
    }

    /// Reads matrix
    /// in case of failure, returns invalid Matrix.
    Mtx read( Logger& logger, int minN = 0, int maxN = 0, Syslog::Severity severity = Syslog::FAULT );

    /// Writes matrix or subset of matrix if min/max m & n are specified
    /// in case of failure, returns false.
    bool write( const Mtx& mtx, Logger& logger,
                int minM = 0, int maxM = -1, int minN = 0, int maxN = -1,
                Syslog::Severity severity = Syslog::FAULT );

    /// Writes matrix or subset of matrix if min/max m & n are specified
    /// in case of failure, returns false.
    bool append( const Mtx& mtx, Logger& logger,
                 Syslog::Severity severity );

};

#endif /* MTXIOSTREAM_H_ */
