#ifndef _INCLUDED_BOBCAT_TABLESUPPORT_
#define _INCLUDED_BOBCAT_TABLESUPPORT_

#include <ostream>
#include <vector>
#include <numeric>

namespace FBB
{

class TableSupport
{
    std::ostream *d_streamPtr;
    size_t d_rows;
    std::vector<size_t> const *d_colWidth;
    size_t d_maxWidth;
    size_t d_tableWidth;

    public:
        TableSupport();

        inline virtual ~TableSupport();     // g++ bug workaround

        void setParam(std::ostream &ostr, size_t rows, 
                        std::vector<size_t> const &colWidth,
                        size_t maxWidth);

        void setParam(size_t maxWidth);
        size_t tableWidth() const;
        size_t nColumns() const;
        std::ostream &out() const;

        virtual void hline(size_t row) const;
        virtual void hline() const;
        virtual void vline(size_t col) const;
        virtual void vline() const;
};

inline TableSupport::~TableSupport()
{}

inline void TableSupport::setParam(size_t maxWidth)
{
    d_maxWidth = maxWidth;  // 0 if colWidth should be used.
}

inline size_t TableSupport::tableWidth() const
{
    return d_tableWidth;
}

inline size_t TableSupport::nColumns() const
{
    return d_colWidth->size();
}

inline std::ostream &TableSupport::out() const
{
    return *d_streamPtr;
}

inline void TableSupport::hline(size_t row) const
{}

inline void TableSupport::hline() const
{}

inline void TableSupport::vline(size_t col) const
{
    if (col)
        *d_streamPtr << ' ';
}

inline void TableSupport::vline() const
{
    *d_streamPtr << '\n';
}

} // FBB
        
#endif
