1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_UI_POINT
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_UI_POINT
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
208683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian#include <utils/Flattenable.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/TypeHelpers.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopianclass Point : public LightFlattenablePod<Point>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int x;
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int y;
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we don't provide copy-ctor and operator= on purpose
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // because we want the compiler generated versions
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Default constructor doesn't initialize the Point
3535801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    inline Point() {
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3735801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    inline Point(int x, int y) : x(x), y(y) {
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool operator == (const Point& rhs) const {
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (x == rhs.x) && (y == rhs.y);
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool operator != (const Point& rhs) const {
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return !operator == (rhs);
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool isOrigin() const {
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return !(x|y);
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // operator < defines an order which allows to use points in sorted
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // vectors.
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool operator < (const Point& rhs) const {
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return y<rhs.y || (y==rhs.y && x<rhs.x);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Point& operator - () {
5835801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        x = -x;
5935801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        y = -y;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return *this;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Point& operator += (const Point& rhs) {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        x += rhs.x;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        y += rhs.y;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return *this;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Point& operator -= (const Point& rhs) {
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        x -= rhs.x;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        y -= rhs.y;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return *this;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7435801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    const Point operator + (const Point& rhs) const {
7535801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        const Point result(x+rhs.x, y+rhs.y);
7635801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        return result;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
7835801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    const Point operator - (const Point& rhs) const {
7935801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        const Point result(x-rhs.x, y-rhs.y);
8035801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        return result;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS(Point)
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_UI_POINT
89