template<class T>
class Point2d
{
public:
Point2d( void )
: x( (T)0 )
, y( (T)0 )
{ }
Point2d( T px, T py )
: x( px )
, y( py )
{ }
Point2d<T> operator=( const Point2d& p )
{
if ( *this == p ) return *this;
x = p.x;
y = p.y;
return *this;
}
Point2d<T>& operator*( T m )
{
return Point2d<T>( x * m, y * m );
}
Point2d<T>& operator*( const Point2d& m )
{
return Point2d<T>( x * m.x, y * m.y );
}
Point2d<T>& operator*=( T m )
{
x *= m;
y *= m;
return *this;
}
Point2d<T>& operator*=( const Point2d& m )
{
x *= m.x;
y *= m.y;
return *this;
}
Point2d<T>& operator/( T d )
{
return Point2d<T>( x / d, y / d );
}
Point2d<T>& operator/( const Point2d& d )
{
return Point2d<T>( x / d.x, y / d.y );
}
Point2d<T>& operator/=( T d )
{
x /= d;
y /= d;
return *this;
}
Point2d<T>& operator/=( const Point2d& d )
{
x /= d.x;
y /= d.y;
return *this;
}
Point2d<T>& operator +( const Point2d& v )
{
return Point2d<T>( x + (T)v.x, y + (T)v.y );
}
Point2d<T>& operator+=( const Point2d& v )
{
x += v.x;
y += v.y;
return *this;
}
Point2d<T>& operator -( const Point2d& v )
{
return Point2d<T>( x - v.x, y - v.y );
}
Point2d<T>& operator-=( const Point2d& v )
{
x -= v.x;
y -= v.y;
return *this;
}
bool operator==( const Point2d& v )
{
return (x == v.x) && (y == v.y);
}
float Dot( Point2d<T> p )
{
return ((float)p.x*(float)x) + ((float)p.y*(float)y);
}
union {
struct {
T x, y;
};
struct {
T width, height;
};
T component[2];
};
};
typedef Point2d<float> Point2f;
int main()
{
Point2f test( 10.0f, -1.0f );
float result = test.Dot( Point2f( 5.0f, 2.0f ) );
return 0;
}
dGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgUG9pbnQyZAp7CnB1YmxpYzoKICAgIFBvaW50MmQoIHZvaWQgKQogICAgICAgIDogeCggKFQpMCApCiAgICAgICAgLCB5KCAoVCkwICkKICAgIHsgfQoKICAgIFBvaW50MmQoIFQgcHgsIFQgcHkgKQogICAgICAgIDogeCggcHggKQogICAgICAgICwgeSggcHkgKQogICAgeyB9CgogICAgUG9pbnQyZDxUPiBvcGVyYXRvcj0oIGNvbnN0IFBvaW50MmQmIHAgKQogICAgewogICAgICAgIGlmICggKnRoaXMgPT0gcCApIHJldHVybiAqdGhpczsKCiAgICAgICAgeCA9IHAueDsKICAgICAgICB5ID0gcC55OwoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IqKCBUIG0gKQogICAgewogICAgICAgIHJldHVybiBQb2ludDJkPFQ+KCB4ICogbSwgeSAqIG0gKTsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvciooIGNvbnN0IFBvaW50MmQmIG0gKQogICAgewogICAgICAgIHJldHVybiBQb2ludDJkPFQ+KCB4ICogbS54LCB5ICogbS55ICk7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IqPSggVCBtICkKICAgIHsKICAgICAgICB4ICo9IG07CiAgICAgICAgeSAqPSBtOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvcio9KCBjb25zdCBQb2ludDJkJiBtICkKICAgIHsKICAgICAgICB4ICo9IG0ueDsKICAgICAgICB5ICo9IG0ueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IvKCBUIGQgKQogICAgewogICAgICAgIHJldHVybiBQb2ludDJkPFQ+KCB4IC8gZCwgeSAvIGQgKTsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvci8oIGNvbnN0IFBvaW50MmQmIGQgKQogICAgewogICAgICAgIHJldHVybiBQb2ludDJkPFQ+KCB4IC8gZC54LCB5IC8gZC55ICk7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IvPSggVCBkICkKICAgIHsKICAgICAgICB4IC89IGQ7CiAgICAgICAgeSAvPSBkOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvci89KCBjb25zdCBQb2ludDJkJiBkICkKICAgIHsKICAgICAgICB4IC89IGQueDsKICAgICAgICB5IC89IGQueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IgKyggY29uc3QgUG9pbnQyZCYgdiApCiAgICB7CiAgICAgICAgcmV0dXJuIFBvaW50MmQ8VD4oIHggKyAoVCl2LngsIHkgKyAoVCl2LnkgKTsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvcis9KCBjb25zdCBQb2ludDJkJiB2ICkKICAgIHsKICAgICAgICB4ICs9IHYueDsKICAgICAgICB5ICs9IHYueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgUG9pbnQyZDxUPiYgb3BlcmF0b3IgLSggY29uc3QgUG9pbnQyZCYgdiApCiAgICB7CiAgICAgICAgcmV0dXJuIFBvaW50MmQ8VD4oIHggLSB2LngsIHkgLSB2LnkgKTsKICAgIH0KCiAgICBQb2ludDJkPFQ+JiBvcGVyYXRvci09KCBjb25zdCBQb2ludDJkJiB2ICkKICAgIHsKICAgICAgICB4IC09IHYueDsKICAgICAgICB5IC09IHYueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBQb2ludDJkJiB2ICkKICAgIHsKICAgICAgICByZXR1cm4gKHggPT0gdi54KSAmJiAoeSA9PSB2LnkpOwogICAgfQoKICAgIGZsb2F0IERvdCggUG9pbnQyZDxUPiBwICkKICAgIHsKICAgICAgICByZXR1cm4gKChmbG9hdClwLngqKGZsb2F0KXgpICsgKChmbG9hdClwLnkqKGZsb2F0KXkpOwogICAgfQoKICAgIHVuaW9uIHsKICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICBUICAgeCwgeTsKICAgICAgICB9OwogICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgIFQgICB3aWR0aCwgaGVpZ2h0OwogICAgICAgIH07CiAgICAgICAgVCBjb21wb25lbnRbMl07CiAgICB9Owp9Owp0eXBlZGVmIFBvaW50MmQ8ZmxvYXQ+IFBvaW50MmY7CgppbnQgbWFpbigpCnsKICAgUG9pbnQyZiB0ZXN0KCAxMC4wZiwgLTEuMGYgKTsKICAgZmxvYXQgcmVzdWx0ID0gdGVzdC5Eb3QoIFBvaW50MmYoIDUuMGYsIDIuMGYgKSApOwogICByZXR1cm4gMDsKfQ==