/*
 *  dmatrix.cpp  - the client code for matrix
 *  (C) Porkolab Zoltan, ELTE, Budapest, Hungary
 *  (C) 2004
 */

// for VC++ 6.0
// #pragma warning(disable:4786)

#include <iostream>
#include <string>
#include <algorithm>

#include "dmatrix.h"

class count_objects
{
public:
    count_objects()  { ++cnt; }
    ~count_objects() { --cnt; }
    static int objects_exist() { return cnt; }
private:
    static int cnt;
};

int count_objects::cnt = 0;


/* this is how I imagine diagonal matrix:

dmatrix<int> dm(n,k)    nxn matrix, the width of the diagonal is 2k-1

example1:
dmatrix<int> dm1(5,1)  
    5x5 matrix, stored elements: (0,0),(1,1),(2,2),(3,3),(4,4)
                others are not stored and automatically return 0
    x - - - -
    - x - - -
    - - x - -
    - - - x -
    - - - - x

example2:
dmatrix<int> dm2(5,2)

    x x - - -   stored: (0,0),(0,1),
    x x x - -           (1,0),(1,1),(1,2)
    - x x x -           (2,1),(2,2),(2,3)
    - - x x x           (3,2),(3,3),(3,4)
    - - - x x                 (4,3),(4,4)

*/

int main()
{
    int yourMark(1);
    
//* 2-es
    dmatrix<int>         m1(10,1);  // creates 10x10 diagonal matrix with 0
    dmatrix<double>      m2(20,2);  // creates 20x20 diagonal matrix with 0.0
    dmatrix<std::string> m3(15,3);  // creates 15x15 diagonal matrix with ""

    m1.set(1,1, 4);         // m1(1,1)   = 4
    m1.set(8,8, 5);         // m1(8,8)   = 5
    m3.set(12,14, "Hello"); // m3(12,14) = "Hello"

    if ( sizeof(m1) < 40 )  // avoid stupid implementations
        yourMark += m1.get(8,8) - m1.get(1,1) - m1.get(4,8);
//*/

//* 3-as 
    const dmatrix<int> cm = m1;
    --m1(1,1);
    yourMark += cm(1,1) - m1(1,1) + m1(9,9); 
//*/
 
//* 4-es 
    // count_objects is my class, do not bother with it
    dmatrix<count_objects> com(15,2);   // creates 15x15 diagonal matrix from 
                                        // count_objects(). only 2k-1 width 
                                        // elemenst are created and stored
    if ( count_objects::objects_exist() < 50 )
        ++yourMark; // ok, you do not waste memory
//*/
            
//* 5-os
    dmatrix<int>::iterator i = std::find( m1.begin(), m1.end(), 5);
    if ( m1.end() != i )
    {
        dmatrix<int>::const_iterator ci = i;
        yourMark = *ci;
    }
//*/

    std::cout << "Your mark is " << yourMark << std::endl;
    return 0;
}