/*
 *  mmatrix_with_map.cpp  - the client code for multidimension matrix
 *  map version (testing iterator -> const_iterator conversion).
 *  (C) Porkolab Zoltan, ELTE, Budapest, Hungary
 *  (C) 2003
 */

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

#include "mmatrix_with_map.h"

int main()
{
    int yourMark(1);
    
//* 2-es
    mmatrix<int>::index i1;     // represents the index as N element array
    i1.put(3).put(4).put(5);    // three dimensions
    mmatrix<int>    m1(i1);     // creates matrix of 3x4x5 of integers 0

    mmatrix<double>::index i2;
    i2.put(2).put(2);           // two dimensions
    mmatrix<double> m2(i2);     // creates matrix of 2x2 of doubles 0.0

    mmatrix<std::string>::index i3;
    i3.put(2).put(2).put(5).put(5); // four dimensions
    mmatrix<std::string> m3(i3);    // creates matrix of 2x2x5x5 of strings ""

    if ( sizeof(i3) < 40 && sizeof(m3) < 40 ) // avoid stupid implementations
        yourMark = m2.dim();    // dimension of m2 (==2)
//*/

//* 3-as
    i1.reset();     
    i1.put(2).put(3).put(4);     
    m1.at(i1) = 5;              // m1(2,3,4) = 5
   
    i3.reset();
    i3.put(0).put(1).put(2).put(3);
    m3.at(i3) = "Hello";        // m3(0,1,2,3) = "Hello"
 
    mmatrix<int>::index i4;
    i4.put(0).put(0).put(0);
    m1.at(i4) = 4;              // m1(0,0,0) = 4

    yourMark += m1.at(i1) - m1.at(i4);
//*/

//* 4-es
    const mmatrix<int> cm = m1;
    --m1[i4];

    yourMark += cm[i4] - m1[i4]; 
//*/ 

//* 5-os
    --m1[i1];        // m1(2,3,4) = 4
    mmatrix<int>::iterator i = find( m1.begin(), m1.end(), 4);
    if ( m1.end() != i )    // hopefully i refer to m1(2,3,4)
        ++ *i;
    yourMark = m1[i1];

    // a const_iterator tesztje:
    mmatrix<int>::const_iterator ci = i;
    std::cout << *ci << std::endl;
//*/

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