# containers/matrix.hpp

    #ifndef STLPLUS_MATRIX
    #define STLPLUS_MATRIX
    ////////////////////////////////////////////////////////////////////////////////

    //   Author:    Andy Rushton
    //   Copyright: (c) Southampton University 1999-2004
    //              (c) Andy Rushton           2004 onwards
    //   License:   BSD License, see ../docs/license.html

    //   General-purpose 2D matrix data structure

    ////////////////////////////////////////////////////////////////////////////////
    #include "containers_fixes.hpp"
    #include <stdexcept>

    namespace stlplus
    {

      ////////////////////////////////////////////////////////////////////////////////

      template<typename T> class matrix
      {
      public:
        matrix(unsigned rows = 0, unsigned cols = 0, const T& fill = T()) ;
        ~matrix(void) ;

        matrix(const matrix&) ;
        matrix& operator =(const matrix&) ;

        void resize(unsigned rows, unsigned cols, const T& fill = T()) ;

        unsigned rows(void) const ;
        unsigned columns(void) const ;

        void erase(const T& fill = T()) ;
        // exceptions: std::out_of_range
        void erase(unsigned row, unsigned col, const T& fill = T()) ;
        // exceptions: std::out_of_range
        void insert(unsigned row, unsigned col, const T&) ;
        // exceptions: std::out_of_range
        const T& item(unsigned row, unsigned col) const ;
        // exceptions: std::out_of_range
        T& item(unsigned row, unsigned col) ;
        // exceptions: std::out_of_range
        const T& operator()(unsigned row, unsigned col) const ;
        // exceptions: std::out_of_range
        T& operator()(unsigned row, unsigned col) ;

        void fill(const T& item = T()) ;
        // exceptions: std::out_of_range
        void fill_column(unsigned col, const T& item = T()) ;
        // exceptions: std::out_of_range
        void fill_row(unsigned row, const T& item = T()) ;
        void fill_leading_diagonal(const T& item = T()) ;
        void fill_trailing_diagonal(const T& item = T()) ;
        void make_identity(const T& one, const T& zero = T()) ;

        void transpose(void) ;

      private:
        unsigned m_rows;
        unsigned m_cols;
        T** m_data;
      };

      ////////////////////////////////////////////////////////////////////////////////

    } // end namespace stlplus

    #include "matrix.tpp"
    #endif