#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
void print( float t) { cout << t << endl; }
class array {
public :
size_t size;
float * data;
// constructor
array( int m)
{
size = m;
data = new float [ size] ;
}
// destructor
~array( )
{
delete [ ] data;
}
friend void swap( array& first, array& second)
{
using std:: swap ;
swap( first.data ,second.data ) ;
swap( first.size ,second.size ) ;
}
//! copy constructor
array( const array& other) : size( other.size ) , data( size ? new float [ size] : 0 )
{
std:: copy ( other.data , other.data + size, data) ;
}
// move constructor
array( array&& other)
{
swap( * this ,other) ;
}
//! copy assignment
array& operator= ( array other)
{
swap( * this ,other) ;
return * this ;
}
// operator- between two arrays
const array operator- ( const array& other)
{
assert ( size== other.size && "Cannot add array of different sizes!" ) ;
array tmp( other.size ) ;
for ( size_t i= 0 ; i< size; ++ i)
tmp.data [ i] = data[ i] - other.data [ i] ;
return tmp;
}
void fill( const float & num)
{
std:: fill ( data,data+ size,num) ;
}
} ;
array operator - ( float lhs, const array& rhs)
{
array tmp( rhs.size ) ;
for ( size_t i= 0 ; i< rhs.size ; ++ i)
tmp.data [ i] = lhs- rhs.data [ i] ;
cout << "called first overload" << endl;
return tmp;
}
array operator - ( array& lhs, float rhs)
{
array tmp( lhs.size ) ;
for ( size_t i= 0 ; i< lhs.size ; ++ i)
tmp.data [ i] = lhs.data [ i] - rhs;
cout << "called second overload" << endl;
return tmp;
}
void print( const array& t) {
for ( size_t i= 0 ; i< t.size ; ++ i)
cout << t.data [ i] << " " ;
cout << endl;
}
int main( )
{
array f( 5 ) ;
f.fill ( 13.4 ) ;
print( f) ;
print( 2 - f- 5 ) ;
print( 2 - ( f- 5 ) ) ;
cout << "All Good!" << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXNzZXJ0Lmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBwcmludChmbG9hdCB0KSB7Y291dCA8PCB0IDw8IGVuZGw7fQoKCmNsYXNzIGFycmF5IHsKcHVibGljOgoKICAgIHNpemVfdCBzaXplOwogICAgZmxvYXQgKmRhdGE7IAoKICAgIC8vIGNvbnN0cnVjdG9yCiAgICBhcnJheShpbnQgbSkKICAgIHsKICAgICAgICBzaXplID0gbTsKICAgICAgICBkYXRhID0gbmV3IGZsb2F0W3NpemVdOwogICAgfQogICAgLy8gZGVzdHJ1Y3RvcgogICAgfmFycmF5KCkKICAgIHsKICAgICAgICBkZWxldGUgW10gZGF0YTsKICAgIH0KCiAgICBmcmllbmQgdm9pZCBzd2FwKGFycmF5JiBmaXJzdCwgYXJyYXkmc2Vjb25kKQogICAgewogICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKICAgICAgICBzd2FwKGZpcnN0LmRhdGEsc2Vjb25kLmRhdGEpOwogICAgICAgIHN3YXAoZmlyc3Quc2l6ZSxzZWNvbmQuc2l6ZSk7CiAgICB9CgogICAgLy8hIGNvcHkgY29uc3RydWN0b3IKICAgIGFycmF5KGNvbnN0IGFycmF5JiBvdGhlcik6IHNpemUob3RoZXIuc2l6ZSksIGRhdGEoc2l6ZSA/IG5ldyBmbG9hdFtzaXplXTowKQogICAgewogICAgICAgIHN0ZDo6Y29weShvdGhlci5kYXRhLCBvdGhlci5kYXRhICsgc2l6ZSwgZGF0YSk7CiAgICB9CgogICAgLy8gbW92ZSBjb25zdHJ1Y3RvcgogICAgYXJyYXkoYXJyYXkmJiBvdGhlcikgCiAgICB7CiAgICAgICAgc3dhcCgqdGhpcyxvdGhlcik7CiAgICB9CgogICAgLy8hIGNvcHkgYXNzaWdubWVudAogICAgYXJyYXkmIG9wZXJhdG9yPShhcnJheSBvdGhlcikKICAgIHsKICAgICAgICBzd2FwKCp0aGlzLG90aGVyKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8gb3BlcmF0b3ItIGJldHdlZW4gdHdvIGFycmF5cwogICAgY29uc3QgYXJyYXkgb3BlcmF0b3ItKGNvbnN0IGFycmF5JiBvdGhlcikgCiAgICB7CiAgICAgICAgYXNzZXJ0KHNpemU9PW90aGVyLnNpemUgJiYgIkNhbm5vdCBhZGQgYXJyYXkgb2YgZGlmZmVyZW50IHNpemVzISIpOwogICAgICAgIGFycmF5IHRtcChvdGhlci5zaXplKTsgCiAgICAgICAgZm9yIChzaXplX3QgaT0wO2k8c2l6ZTsrK2kpCiAgICAgICAgICAgIHRtcC5kYXRhW2ldID0gZGF0YVtpXS1vdGhlci5kYXRhW2ldOwoKICAgICAgICByZXR1cm4gdG1wOwogICAgfQoKICAgIHZvaWQgZmlsbChjb25zdCBmbG9hdCYgbnVtKQogICAgewogICAgICAgIHN0ZDo6ZmlsbChkYXRhLGRhdGErc2l6ZSxudW0pOwogICAgfQp9OwoKCmFycmF5IG9wZXJhdG9yIC0oZmxvYXQgbGhzLCBjb25zdCBhcnJheSYgcmhzKQp7CiAgICBhcnJheSB0bXAocmhzLnNpemUpOwogICAgZm9yIChzaXplX3QgaT0wO2k8cmhzLnNpemU7KytpKQogICAgICAgdG1wLmRhdGFbaV0gPSBsaHMtcmhzLmRhdGFbaV07CiAgICBjb3V0IDw8ICJjYWxsZWQgZmlyc3Qgb3ZlcmxvYWQiIDw8IGVuZGw7CiAgICByZXR1cm4gdG1wOwp9CgphcnJheSBvcGVyYXRvciAtKCBhcnJheSYgbGhzLCBmbG9hdCByaHMpCnsKICAgIGFycmF5IHRtcChsaHMuc2l6ZSk7CiAgICBmb3IgKHNpemVfdCBpPTA7aTxsaHMuc2l6ZTsrK2kpCiAgICAgICB0bXAuZGF0YVtpXSA9IGxocy5kYXRhW2ldLXJoczsKICAgIGNvdXQgPDwgImNhbGxlZCBzZWNvbmQgb3ZlcmxvYWQiIDw8IGVuZGw7CiAgICByZXR1cm4gdG1wOwp9Cgp2b2lkIHByaW50KGNvbnN0IGFycmF5JiB0KSB7CiAgICBmb3IgKHNpemVfdCBpPTA7aTx0LnNpemU7KytpKQogICAgICAgIGNvdXQgPDwgdC5kYXRhW2ldIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKfQoKCgppbnQgbWFpbigpCnsKICAgIGFycmF5IGYoNSk7CiAgICBmLmZpbGwoMTMuNCk7CiAgICBwcmludChmKTsKCiAgICBwcmludCgyLWYtNSk7CiAgICBwcmludCgyLShmLTUpKTsKCiAgICBjb3V0IDw8ICJBbGwgR29vZCEiIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfSA=