test_operator_overloading.cpp revision 11986
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    tests/test_operator_overloading.cpp -- operator overloading
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
511986Sandreas.sandberg@arm.com
611986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
711986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
811986Sandreas.sandberg@arm.com*/
911986Sandreas.sandberg@arm.com
1011986Sandreas.sandberg@arm.com#include "pybind11_tests.h"
1111986Sandreas.sandberg@arm.com#include "constructor_stats.h"
1211986Sandreas.sandberg@arm.com#include <pybind11/operators.h>
1311986Sandreas.sandberg@arm.com
1411986Sandreas.sandberg@arm.comclass Vector2 {
1511986Sandreas.sandberg@arm.compublic:
1611986Sandreas.sandberg@arm.com    Vector2(float x, float y) : x(x), y(y) { print_created(this, toString()); }
1711986Sandreas.sandberg@arm.com    Vector2(const Vector2 &v) : x(v.x), y(v.y) { print_copy_created(this); }
1811986Sandreas.sandberg@arm.com    Vector2(Vector2 &&v) : x(v.x), y(v.y) { print_move_created(this); v.x = v.y = 0; }
1911986Sandreas.sandberg@arm.com    ~Vector2() { print_destroyed(this); }
2011986Sandreas.sandberg@arm.com
2111986Sandreas.sandberg@arm.com    std::string toString() const {
2211986Sandreas.sandberg@arm.com        return "[" + std::to_string(x) + ", " + std::to_string(y) + "]";
2311986Sandreas.sandberg@arm.com    }
2411986Sandreas.sandberg@arm.com
2511986Sandreas.sandberg@arm.com    void operator=(const Vector2 &v) {
2611986Sandreas.sandberg@arm.com        print_copy_assigned(this);
2711986Sandreas.sandberg@arm.com        x = v.x;
2811986Sandreas.sandberg@arm.com        y = v.y;
2911986Sandreas.sandberg@arm.com    }
3011986Sandreas.sandberg@arm.com
3111986Sandreas.sandberg@arm.com    void operator=(Vector2 &&v) {
3211986Sandreas.sandberg@arm.com        print_move_assigned(this);
3311986Sandreas.sandberg@arm.com        x = v.x; y = v.y; v.x = v.y = 0;
3411986Sandreas.sandberg@arm.com    }
3511986Sandreas.sandberg@arm.com
3611986Sandreas.sandberg@arm.com    Vector2 operator+(const Vector2 &v) const { return Vector2(x + v.x, y + v.y); }
3711986Sandreas.sandberg@arm.com    Vector2 operator-(const Vector2 &v) const { return Vector2(x - v.x, y - v.y); }
3811986Sandreas.sandberg@arm.com    Vector2 operator-(float value) const { return Vector2(x - value, y - value); }
3911986Sandreas.sandberg@arm.com    Vector2 operator+(float value) const { return Vector2(x + value, y + value); }
4011986Sandreas.sandberg@arm.com    Vector2 operator*(float value) const { return Vector2(x * value, y * value); }
4111986Sandreas.sandberg@arm.com    Vector2 operator/(float value) const { return Vector2(x / value, y / value); }
4211986Sandreas.sandberg@arm.com    Vector2& operator+=(const Vector2 &v) { x += v.x; y += v.y; return *this; }
4311986Sandreas.sandberg@arm.com    Vector2& operator-=(const Vector2 &v) { x -= v.x; y -= v.y; return *this; }
4411986Sandreas.sandberg@arm.com    Vector2& operator*=(float v) { x *= v; y *= v; return *this; }
4511986Sandreas.sandberg@arm.com    Vector2& operator/=(float v) { x /= v; y /= v; return *this; }
4611986Sandreas.sandberg@arm.com
4711986Sandreas.sandberg@arm.com    friend Vector2 operator+(float f, const Vector2 &v) { return Vector2(f + v.x, f + v.y); }
4811986Sandreas.sandberg@arm.com    friend Vector2 operator-(float f, const Vector2 &v) { return Vector2(f - v.x, f - v.y); }
4911986Sandreas.sandberg@arm.com    friend Vector2 operator*(float f, const Vector2 &v) { return Vector2(f * v.x, f * v.y); }
5011986Sandreas.sandberg@arm.com    friend Vector2 operator/(float f, const Vector2 &v) { return Vector2(f / v.x, f / v.y); }
5111986Sandreas.sandberg@arm.comprivate:
5211986Sandreas.sandberg@arm.com    float x, y;
5311986Sandreas.sandberg@arm.com};
5411986Sandreas.sandberg@arm.com
5511986Sandreas.sandberg@arm.comtest_initializer operator_overloading([](py::module &m) {
5611986Sandreas.sandberg@arm.com    py::class_<Vector2>(m, "Vector2")
5711986Sandreas.sandberg@arm.com        .def(py::init<float, float>())
5811986Sandreas.sandberg@arm.com        .def(py::self + py::self)
5911986Sandreas.sandberg@arm.com        .def(py::self + float())
6011986Sandreas.sandberg@arm.com        .def(py::self - py::self)
6111986Sandreas.sandberg@arm.com        .def(py::self - float())
6211986Sandreas.sandberg@arm.com        .def(py::self * float())
6311986Sandreas.sandberg@arm.com        .def(py::self / float())
6411986Sandreas.sandberg@arm.com        .def(py::self += py::self)
6511986Sandreas.sandberg@arm.com        .def(py::self -= py::self)
6611986Sandreas.sandberg@arm.com        .def(py::self *= float())
6711986Sandreas.sandberg@arm.com        .def(py::self /= float())
6811986Sandreas.sandberg@arm.com        .def(float() + py::self)
6911986Sandreas.sandberg@arm.com        .def(float() - py::self)
7011986Sandreas.sandberg@arm.com        .def(float() * py::self)
7111986Sandreas.sandberg@arm.com        .def(float() / py::self)
7211986Sandreas.sandberg@arm.com        .def("__str__", &Vector2::toString)
7311986Sandreas.sandberg@arm.com        ;
7411986Sandreas.sandberg@arm.com
7511986Sandreas.sandberg@arm.com    m.attr("Vector") = m.attr("Vector2");
7611986Sandreas.sandberg@arm.com});
77