//
//  math_io.h
//  ARToolKit5
//
//  This file is part of ARToolKit.
//
//  ARToolKit is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  ARToolKit 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
//  GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License
//  along with ARToolKit.  If not, see <http://www.gnu.org/licenses/>.
//
//  As a special exception, the copyright holders of this library give you
//  permission to link this library with independent modules to produce an
//  executable, regardless of the license terms of these independent modules, and to
//  copy and distribute the resulting executable under terms of your choice,
//  provided that you also meet, for each linked independent module, the terms and
//  conditions of the license of that module. An independent module is a module
//  which is neither derived from nor based on this library. If you modify this
//  library, you may extend this exception to your version of the library, but you
//  are not obligated to do so. If you do not wish to do so, delete this exception
//  statement from your version.
//
//  Copyright 2013-2015 Daqri, LLC.
//
//  Author(s): Chris Broaddus
//

#pragma once

#include <string>
#include <iostream>

namespace vision {
    
    /**
     * Print a matrix to the console.
     */
    template<typename T, typename TCAST>
    inline void PrintMatrix(std::ostream& os, const T* X, size_t width, size_t height, const std::string& str) {
        os << str << " = [" << std::endl;
        for(size_t i = 0; i < height; i++) {
            os << "\t";
            for(size_t j = 0; j < width; j++) {
                os << (TCAST)X[i*width+j];
                if(j < width-1) {
                    os << " ";
                }
            }
            os << std::endl;
        }
        os << "];" << std::endl;
    }
    template<typename T>
    inline void PrintMatrix(std::ostream& os, const T* X, size_t width, size_t height, const std::string& str) {
        PrintMatrix<T, T>(os, X, width, height, str);
    }
    template<typename T, typename TCAST>
    inline void PrintMatrix(const T* X, size_t width, size_t height, const std::string& str) {
        PrintMatrix(std::cout, X, width, height, str);
    }
    template<typename T>
    inline void PrintMatrix(const T* X, size_t width, size_t height, const std::string& str) {
        PrintMatrix<T, T>(std::cout, X, width, height, str);
    }
    
    /**
     * Print a binary string.
     */
    void PrintBinaryString(const unsigned char* bitstring, int size, const char* str);
    
} // vision