#include <vector>
#include <utility>
#include <iostream>
template <typename T>
class Matrix {
private:
class Row {
friend class Matrix;
public:
T& operator[] (int j)&&
{
return matrix.mappedVector[i * matrix.n + j];
}
const T& operator[] (int j) const&&
{
return matrix.mappedVector[i * matrix.n + j];
}
private:
int i;
Matrix& matrix;
Row(int i, Matrix& matrix) : i(i), matrix(matrix) {
std::cout << "int ctor" << std::endl;
}
Row() {
std::cout << "ctor" << std::endl;
}
};
public:
Matrix() :
m(0),
n(0)
{}
explicit Matrix(size_t m, size_t n) : m(m), n(n), mappedVector(m* n){
}
Row operator[] (int i) {
return Row(i, *this);
}
const Row operator[] (int i) const {
return Row(i, *this);
}
private:
size_t m;
size_t n;
std::vector<T> mappedVector;
};
int main()
{
Matrix<int> matrix(2, 5);
matrix[1][0] = 1;
auto autoRowProxy = matrix[1];
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXRyaXggewoKcHJpdmF0ZToKCiAgICBjbGFzcyBSb3cgewogICAgICAgIGZyaWVuZCBjbGFzcyBNYXRyaXg7CgogICAgcHVibGljOgogICAgICAgIFQmIG9wZXJhdG9yW10gKGludCBqKSYmCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbWF0cml4Lm1hcHBlZFZlY3RvcltpICogbWF0cml4Lm4gKyBqXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgVCYgb3BlcmF0b3JbXSAoaW50IGopIGNvbnN0JiYKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBtYXRyaXgubWFwcGVkVmVjdG9yW2kgKiBtYXRyaXgubiArIGpdOwogICAgICAgIH0KICAgIHByaXZhdGU6CiAgICAgICAgaW50IGk7CiAgICAgICAgTWF0cml4JiBtYXRyaXg7CgogICAgICAgIFJvdyhpbnQgaSwgTWF0cml4JiBtYXRyaXgpIDogIGkoaSksICAgbWF0cml4KG1hdHJpeCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImludCBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoKICAgICAgICBSb3coKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiY3RvciIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KCiAgICB9OwpwdWJsaWM6CiAgICBNYXRyaXgoKSA6CiAgICAgICAgbSgwKSwKICAgICAgICBuKDApCiAgICB7fQogICAgZXhwbGljaXQgTWF0cml4KHNpemVfdCBtLCBzaXplX3QgbikgOiAgIG0obSksICAgbihuKSwgICBtYXBwZWRWZWN0b3IobSogbil7CiAgICB9CgoKICAgIFJvdyBvcGVyYXRvcltdIChpbnQgaSkgewogICAgICAgIHJldHVybiBSb3coaSwgKnRoaXMpOwogICAgfQoKICAgIGNvbnN0IFJvdyBvcGVyYXRvcltdIChpbnQgaSkgY29uc3QgIHsKICAgICAgICByZXR1cm4gUm93KGksICp0aGlzKTsKICAgIH0KCnByaXZhdGU6CiAgICBzaXplX3QgbTsKICAgIHNpemVfdCBuOwogICAgc3RkOjp2ZWN0b3I8VD4gbWFwcGVkVmVjdG9yOwp9OwoKaW50IG1haW4oKQp7CiAgICBNYXRyaXg8aW50PiBtYXRyaXgoMiwgNSk7CiAgICBtYXRyaXhbMV1bMF0gPSAxOwoKICAgIGF1dG8gYXV0b1Jvd1Byb3h5ID0gbWF0cml4WzFdOwoKICAgIHJldHVybiAwOwp9