
#include "VectorCpx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
using namespace std;

int main()
{
    // You can redefine DATA_DIR to other directory
    #define DATA_DIR ""
    cout << "---------   VectorCpx  --------" << endl;
    VectorCpx v0;
    v0.push_back(Complex(1)).push_back(Complex(2)).push_back(Complex(3));
    cout << "v0 = " << v0 << endl;
    fstream f0(DATA_DIR "V0.txt", ios::out);
    v0 >> f0;
    f0.close();
    f0.open(DATA_DIR "V0.txt", ios::in);
    v0 << f0;
    f0.close();
    
    cout << "---------   AdvVectorO  --------" << endl;
    AdvVectorO v1;
    AdvVectorO v2(3, Complex(1.2, 3.4));
    AdvVectorO v3 = v0;
    v3[0].real(5.6);
    v3[0].imag(7.8);
    cout << v1 << v2 << v3;
    cout << "v1 = " << v1;
    cout << "v2 = " << v2;
    cout << "v3 = " << v3;
    cout << "v2*v3=" << v2 * v3 << endl;
    
    fstream f1(DATA_DIR "V1.txt", ios::out);
    fstream f2(DATA_DIR "V2.txt", ios::out);
    fstream f3(DATA_DIR "V3.txt", ios::out);
    
    v1 >> f1;
    v2 >> f2 >> f3;
    v3 >> f3;
    
    f1.close();
    f2.close();
    f3.close();
    
    f1.open(DATA_DIR "V1.txt", ios::in);
        v1 << f1;
    f1.close();
    
    cout << "---------   AdvVectorI  --------" << endl;
    AdvVectorI v4(2, Complex(0.5, 0.6));
    f1.open(DATA_DIR "V1.txt", ios::out);
    v4 >> f1;
    f1.close();
    f1.open(DATA_DIR "V1.txt", ios::in);
    f3.open(DATA_DIR "V3.txt", ios::in);
    v4 << f1 << f3;
    cout << "v4 = " << v4;
    
    f1.close();
    f3.close();
    
    
    
    cout << "---------   AdvVectorIO  --------" << endl;
    AdvVectorIO v5 = v2, v6 = v3;
    fstream f5(DATA_DIR "V5.DAT", ios::out | ios::binary);
    fstream f6(DATA_DIR "V6.DAT", ios::out | ios::binary);
    v5 >> f5;
    v6 >> f5 >> f6;
    f5.close();
    f6.close();
    
    f5.open(DATA_DIR "V5.DAT", ios::in | ios::binary);
    f6.open(DATA_DIR "V6.DAT", ios::in | ios::binary);
    AdvVectorIO v5a, v6a;
    v5a << f5;
    f5.clear();     // Clear the EOF state before seekg
    f5.seekg(0);    // Go to the first byte
    v6a << f6 << f5;
    cout << "v5a = " << v5a;
    cout << "v6a = " << v6a;
    
    f5.close();
    f6.close();
    
    cout << "---------   Polymorphism  --------" << endl;
    VectorCpx v7(3, Complex(1));
    VectorCpx *A[4] = {&v7, &v3, &v4, &v5};
    const char*S[4] = {DATA_DIR "A1.txt", DATA_DIR "A2.txt",
                        DATA_DIR "A3.txt", DATA_DIR "A4.txt"};
    for(int i=0; i<4; ++i){
        fstream f(S[i], ios::out | ios::binary);
        cout << "Ouput A[" << i << "]" << endl;
        *A[i] >> f;
        
        f.close();
    }
    for(int i=0; i<4; ++i){
        fstream f(S[i], ios::in | ios::binary);
        *A[i] << f;
        cout << "A[" << i << "] = " << *A[i] << endl;
        f.close();
    }

    system("pause");
}
