/**-------------------------------------------------------------*
 * ZAD4 - rozwiazanie                                           *
 *                                                               *
 * problem: sterowanie przy obsłudze wyjątków, sprytne wskazniki *
 * użyć r-value reference                                       *
 *                                                              *
 *--------------------------------------------------------------*/

#include <memory>
#include <iostream>

using namespace std;

class E : public std::exception {
public:
    E(int i) : i_(i) {}
    int i_;
};

struct B {
    B(int i) : i_(i) { cout << i_; }
    virtual ~B() { cout << i_; }

    int i_;
};

using PB = unique_ptr<B>;

B f(B& b) {
    return B(b.i_+1);
}

B f(B&& b) {
    throw E(b.i_);
}

void g(int i) {
    PB pb(new B(i));
    B b2 = f(*pb);
    B b3 = f(f(*pb));
}

const int LICZBA_LITER_NAZWISKA = 5;

int main() {
	try {
        g(LICZBA_LITER_NAZWISKA);
    } catch(E& e) {
		cout << e.i_;
	}
	cout << endl;
	return 0;
}
