#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, const Matrix* matrix) :
i( i) ,
matrix( const_cast < Matrix* > ( matrix) )
{
std:: cout << "int ctor" << std:: endl ;
}
Row( int i, Matrix* matrix) :
i( i) ,
matrix( matrix)
{
std:: cout << "int ctor" << std:: endl ;
}
Row( )
{
std:: cout << "ctor" << std:: endl ;
}
Row( const Row& )
{
std:: cout << "copy ctor" << std:: endl ;
}
Row& operator= ( const Row& )
{
std:: cout << "assign lvalue" << std:: endl ;
}
Row( Row&& )
{
std:: cout << "move ctor" << std:: endl ;
}
Row& operator= ( Row&& )
{
std:: cout << "assign rvalue" << std:: endl ;
}
} ;
public :
Matrix( ) :
m( 0 ) ,
n( 0 )
{ }
explicit Matrix( size_t m, size_t n) :
m( m) ,
n( n) ,
mappedVector( m* n)
{ }
Matrix( const Matrix& rhs) :
m( rhs.m ) ,
n( rhs.n ) ,
mappedVector( rhs.mappedVector )
{ }
Matrix& operator= ( const Matrix& rhs)
{
if ( & rhs ! = this )
{
m = rhs.m ;
n = rhs.m ;
mappedVector.resize ( rhs.mappedVector .size ) ;
mappedVector = rhs.mappedVector ;
}
}
Matrix( Matrix&& rhs) :
m( std:: exchange ( rhs.m , 0 ) ) ,
n( std:: exchange ( rhs.n , 0 ) ) ,
mappedVector( std:: exchange ( rhs.mappedVector , { } ) )
{ }
Matrix& operator= ( Matrix&& rhs)
{
if ( & rhs ! = this )
{
m = std:: exchange ( rhs.m , 0 ) ;
n = std:: exchange ( rhs.n , 0 ) ;
mappedVector = std:: exchange ( rhs.mappedVector , { } ) ;
}
}
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+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXRyaXgKewpwcml2YXRlOgogICAgY2xhc3MgUm93CiAgICB7CiAgICBmcmllbmQgY2xhc3MgTWF0cml4OwoKICAgIHB1YmxpYzoKICAgICAgICBUJiBvcGVyYXRvcltdIChpbnQgaikgJiYKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBtYXRyaXgtPm1hcHBlZFZlY3RvcltpICogbWF0cml4LT5uICsgal07CiAgICAgICAgfQogICAgICAgIGNvbnN0IFQmIG9wZXJhdG9yW10gKGludCBqKSBjb25zdCAmJgogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG1hdHJpeC0+bWFwcGVkVmVjdG9yW2kgKiBtYXRyaXgtPm4gKyBqXTsKICAgICAgICB9CiAgICBwcml2YXRlOgogICAgICAgIGludCBpOwogICAgICAgIE1hdHJpeCogbWF0cml4OwoKICAgICAgICBSb3coaW50IGksIGNvbnN0IE1hdHJpeCogbWF0cml4KToKICAgICAgICAgICAgaShpKSwKICAgICAgICAgICAgbWF0cml4KGNvbnN0X2Nhc3Q8TWF0cml4Kj4obWF0cml4KSkKICAgICAgICB7CiAgICAgICAgCXN0ZDo6Y291dCA8PCAiaW50IGN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICAgICAgUm93KGludCBpLCBNYXRyaXgqIG1hdHJpeCk6CiAgICAgICAgICAgIGkoaSksCiAgICAgICAgICAgIG1hdHJpeChtYXRyaXgpCiAgICAgICAgewogICAgICAgIAlzdGQ6OmNvdXQgPDwgImludCBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdygpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICAgICAgUm93KGNvbnN0IFJvdyYpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImNvcHkgY3RvciIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAgICAgICBSb3cmIG9wZXJhdG9yPShjb25zdCBSb3cmKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJhc3NpZ24gbHZhbHVlIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdyhSb3cmJikKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAibW92ZSBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdyYgb3BlcmF0b3I9KFJvdyYmKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJhc3NpZ24gcnZhbHVlIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgfTsKcHVibGljOgogICAgTWF0cml4KCk6CiAgICAgICAgbSgwKSwKICAgICAgICBuKDApCiAgICB7fQogICAgZXhwbGljaXQgTWF0cml4KHNpemVfdCBtLCBzaXplX3Qgbik6CiAgICAgICAgbShtKSwKICAgICAgICBuKG4pLAogICAgICAgIG1hcHBlZFZlY3RvcihtKm4pCiAgICB7fQogICAgTWF0cml4KGNvbnN0IE1hdHJpeCYgcmhzKToKICAgICAgICBtKHJocy5tKSwKICAgICAgICBuKHJocy5uKSwKICAgICAgICBtYXBwZWRWZWN0b3IocmhzLm1hcHBlZFZlY3RvcikKICAgIHt9CiAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgmIHJocykKICAgIHsKICAgICAgICBpZigmcmhzICE9IHRoaXMpCiAgICAgICAgewogICAgICAgICAgICBtID0gcmhzLm07CiAgICAgICAgICAgIG4gPSByaHMubTsKICAgICAgICAgICAgbWFwcGVkVmVjdG9yLnJlc2l6ZShyaHMubWFwcGVkVmVjdG9yLnNpemUpOwogICAgICAgICAgICBtYXBwZWRWZWN0b3IgPSByaHMubWFwcGVkVmVjdG9yOwogICAgICAgIH0KICAgIH0KICAgIE1hdHJpeChNYXRyaXgmJiByaHMpOgogICAgICAgIG0oc3RkOjpleGNoYW5nZShyaHMubSwgMCkpLAogICAgICAgIG4oc3RkOjpleGNoYW5nZShyaHMubiwgMCkpLAogICAgICAgIG1hcHBlZFZlY3RvcihzdGQ6OmV4Y2hhbmdlKHJocy5tYXBwZWRWZWN0b3IsIHt9KSkKICAgIHt9CiAgICBNYXRyaXgmIG9wZXJhdG9yPShNYXRyaXgmJiByaHMpCiAgICB7CiAgICAgICAgaWYoJnJocyAhPSB0aGlzKQogICAgICAgIHsKICAgICAgICAgICAgbSA9IHN0ZDo6ZXhjaGFuZ2UocmhzLm0sIDApOwogICAgICAgICAgICBuID0gc3RkOjpleGNoYW5nZShyaHMubiwgMCk7CiAgICAgICAgICAgIG1hcHBlZFZlY3RvciA9IHN0ZDo6ZXhjaGFuZ2UocmhzLm1hcHBlZFZlY3Rvciwge30pOwogICAgICAgIH0KICAgIH0KICAgIFJvdyBvcGVyYXRvcltdIChpbnQgaSkKICAgIHsKICAgICAgICByZXR1cm4gUm93KGksIHRoaXMpOwogICAgfQogICAgY29uc3QgUm93IG9wZXJhdG9yW10gKGludCBpKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBSb3coaSwgdGhpcyk7CiAgICB9CnByaXZhdGU6CiAgICBzaXplX3QgbTsKICAgIHNpemVfdCBuOwogICAgc3RkOjp2ZWN0b3I8VD4gbWFwcGVkVmVjdG9yOwp9OwoKaW50IG1haW4oKQp7CglNYXRyaXg8aW50PiBtYXRyaXgoMiwgNSk7CiAgICBtYXRyaXhbMV1bMF0gPSAxOwogICAgCiAgICBhdXRvIGF1dG9Sb3dQcm94eSA9IG1hdHJpeFsxXTsKICAgIAoJcmV0dXJuIDA7Cn0=