//: C12:IostreamOperatorOverloading.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Example of non-member overloaded operators

#include "../require.h"
#include <iostream>
#include <cstring>
using namespace std;

class IntArray
{

enum { sz = 5 };
int i[sz];

public:

IntArray() { memset(i, 0, sz* sizeof(*i)); }
int& operator[](int x)
{

require(x >= 0 && x < sz,
"IntArray::operator[] out of range");
return i[x];

}

friend ostream& operator<<(ostream& os, const IntArray& ia);
friend istream& operator>>(istream& is, IntArray& ia);

};

/* Questi operatori ridefiniscono ">>" e "<<". Per esempio, l'operatore "<<" stampa i parametri passati separati da virgole, all'interno di una parentesi. */

ostream& operator<<(ostream& os, const IntArray& ia)
{

os << " (" ;
for(int j = 0; j < ia.sz; j++)
{

os << ia.i[j];
if(j != ia.sz -1)
os << ", ";

}

os << ") " ;
return os;

}

istream& operator>>(istream& is, IntArray& ia)
{

for(int j = 0; j < ia.sz; j++)
is >> ia.i[j];
return is;

}

int main()
{

IntArray I;
int i;
cin >> I >> i ;
I[2] = -1; // Use overloaded operator[]
cout << i << I << i << endl ;

} ///:~