/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 
 *
 * This library is open source and may be redistributed and/or modified under  
 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 
 * (at your option) any later version.  The full license is in LICENSE file
 * included with this distribution, and on the openscenegraph.org website.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * OpenSceneGraph Public License for more details.
*/

#ifndef OSGDB_PARAMETEROUTPUT
#define OSGDB_PARAMETEROUTPUT 1

#include <osgDB/Output>

namespace osgDB {

class ParameterOutput
{
    public:
    
        ParameterOutput(Output& fw):
            _fw(fw),
            _numItemsPerLine(fw.getNumIndicesPerLine()),
            _column(0) {}
            
        ParameterOutput(Output& fw,int numItemsPerLine):
            _fw(fw),
            _numItemsPerLine(numItemsPerLine),
            _column(0) {}

        void begin()
        {
            _fw.indent() << "{"<<std::endl;
            _fw.moveIn();
        }

        void newLine()
        {
            if (_column!=0) _fw << std::endl;
            _column = 0;
        }

        void end()
        {
            if (_column!=0) _fw << std::endl;
            _fw.moveOut();
            _fw.indent() << "}"<<std::endl;
            _column = 0;
        }
    
        template<class T>
        void write(const T& t)
        {
            if (_column==0) _fw.indent();

            _fw << t;
            
            ++_column;
            if (_column==_numItemsPerLine)
            {
                _fw << std::endl;
                _column = 0;
            }
            else
            {
                _fw << " ";
            }

        }
        
        template<class Iterator>
        void write(Iterator first, Iterator last)
        {
            for(Iterator itr=first;
                itr!=last;
                ++itr)
            {
                write(*itr);
            }

        }
        
        template<class Iterator>
        void writeAsInts(Iterator first, Iterator last)
        {
            for(Iterator itr=first;
                itr!=last;
                ++itr)
            {
                write((int)*itr);
            }

        }
        
        
    protected:
    
        ParameterOutput& operator = (const ParameterOutput&) { return *this; }

        Output& _fw;
        int     _numItemsPerLine;
        int     _column;
};


template<class Iterator>
void writeArray(Output& fw, Iterator first, Iterator last,int noItemsPerLine=0)
{
    if (noItemsPerLine==0) noItemsPerLine=fw.getNumIndicesPerLine();

    fw.indent() << "{"<<std::endl;
    fw.moveIn();

    int column=0;
    
    for(Iterator itr=first;
        itr!=last;
        ++itr)
    {
        if (column==0) fw.indent();
        
        fw << *itr;
        
        ++column;
        if (column==noItemsPerLine)
        {
            fw << std::endl;
            column = 0;
        }
        else
        {
            fw << " ";
        }
    }
    if (column!=0) fw << std::endl;
    
    fw.moveOut();
    fw.indent()<<"}"<<std::endl;
    
}


template<class Iterator>
void writeArrayAsInts(Output& fw, Iterator first, Iterator last,int noItemsPerLine=0)
{
    if (noItemsPerLine==0) noItemsPerLine=fw.getNumIndicesPerLine();

    fw.indent() << "{"<<std::endl;
    fw.moveIn();

    int column=0;
    
    for(Iterator itr=first;
        itr!=last;
        ++itr)
    {
        if (column==0) fw.indent();
        
        fw << (int)*itr;
        
        ++column;
        if (column==noItemsPerLine)
        {
            fw << std::endl;
            column = 0;
        }
        else
        {
            fw << " ";
        }
    }
    if (column!=0) fw << std::endl;
    
    fw.moveOut();
    fw.indent()<<"}"<<std::endl;
    
}


}

#endif                                            // __SG_OUTPUT_H
