Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef TVEC_IMPLEMENTATION
     18 #error "Don't include TVecHelpers.h directly. use ui/vec*.h instead"
     19 #else
     20 #undef TVEC_IMPLEMENTATION
     21 #endif
     22 
     23 
     24 #ifndef UI_TVEC_HELPERS_H
     25 #define UI_TVEC_HELPERS_H
     26 
     27 #include <stdint.h>
     28 #include <sys/types.h>
     29 
     30 #define PURE __attribute__((pure))
     31 
     32 namespace android {
     33 // -------------------------------------------------------------------------------------
     34 
     35 /*
     36  * No user serviceable parts here.
     37  *
     38  * Don't use this file directly, instead include ui/vec{2|3|4}.h
     39  */
     40 
     41 /*
     42  * This class casts itself into anything and assign itself from anything!
     43  * Use with caution!
     44  */
     45 template <typename TYPE>
     46 struct Impersonator {
     47     Impersonator& operator = (const TYPE& rhs) {
     48         reinterpret_cast<TYPE&>(*this) = rhs;
     49         return *this;
     50     }
     51     operator TYPE& () {
     52         return reinterpret_cast<TYPE&>(*this);
     53     }
     54     operator TYPE const& () const {
     55         return reinterpret_cast<TYPE const&>(*this);
     56     }
     57 };
     58 
     59 /*
     60  * TVec{Add|Product}Operators implements basic arithmetic and basic compound assignments
     61  * operators on a vector of type BASE<T>.
     62  *
     63  * BASE only needs to implement operator[] and size().
     64  * By simply inheriting from TVec{Add|Product}Operators<BASE, T> BASE will automatically
     65  * get all the functionality here.
     66  */
     67 
     68 template <template<typename T> class BASE, typename T>
     69 class TVecAddOperators {
     70 public:
     71     /* compound assignment from a another vector of the same size but different
     72      * element type.
     73      */
     74     template <typename OTHER>
     75     BASE<T>& operator += (const BASE<OTHER>& v) {
     76         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
     77         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
     78             rhs[i] += v[i];
     79         }
     80         return rhs;
     81     }
     82     template <typename OTHER>
     83     BASE<T>& operator -= (const BASE<OTHER>& v) {
     84         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
     85         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
     86             rhs[i] -= v[i];
     87         }
     88         return rhs;
     89     }
     90 
     91     /* compound assignment from a another vector of the same type.
     92      * These operators can be used for implicit conversion and  handle operations
     93      * like "vector *= scalar" by letting the compiler implicitly convert a scalar
     94      * to a vector (assuming the BASE<T> allows it).
     95      */
     96     BASE<T>& operator += (const BASE<T>& v) {
     97         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
     98         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
     99             rhs[i] += v[i];
    100         }
    101         return rhs;
    102     }
    103     BASE<T>& operator -= (const BASE<T>& v) {
    104         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    105         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    106             rhs[i] -= v[i];
    107         }
    108         return rhs;
    109     }
    110 
    111     /*
    112      * NOTE: the functions below ARE NOT member methods. They are friend functions
    113      * with they definition inlined with their declaration. This makes these
    114      * template functions available to the compiler when (and only when) this class
    115      * is instantiated, at which point they're only templated on the 2nd parameter
    116      * (the first one, BASE<T> being known).
    117      */
    118 
    119     /* The operators below handle operation between vectors of the same side
    120      * but of a different element type.
    121      */
    122     template<typename RT>
    123     friend inline
    124     BASE<T> PURE operator +(const BASE<T>& lv, const BASE<RT>& rv) {
    125         return BASE<T>(lv) += rv;
    126     }
    127     template<typename RT>
    128     friend inline
    129     BASE<T> PURE operator -(const BASE<T>& lv, const BASE<RT>& rv) {
    130         return BASE<T>(lv) -= rv;
    131     }
    132 
    133     /* The operators below (which are not templates once this class is instanced,
    134      * i.e.: BASE<T> is known) can be used for implicit conversion on both sides.
    135      * These handle operations like "vector * scalar" and "scalar * vector" by
    136      * letting the compiler implicitly convert a scalar to a vector (assuming
    137      * the BASE<T> allows it).
    138      */
    139     friend inline
    140     BASE<T> PURE operator +(const BASE<T>& lv, const BASE<T>& rv) {
    141         return BASE<T>(lv) += rv;
    142     }
    143     friend inline
    144     BASE<T> PURE operator -(const BASE<T>& lv, const BASE<T>& rv) {
    145         return BASE<T>(lv) -= rv;
    146     }
    147 };
    148 
    149 template <template<typename T> class BASE, typename T>
    150 class TVecProductOperators {
    151 public:
    152     /* compound assignment from a another vector of the same size but different
    153      * element type.
    154      */
    155     template <typename OTHER>
    156     BASE<T>& operator *= (const BASE<OTHER>& v) {
    157         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    158         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    159             rhs[i] *= v[i];
    160         }
    161         return rhs;
    162     }
    163     template <typename OTHER>
    164     BASE<T>& operator /= (const BASE<OTHER>& v) {
    165         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    166         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    167             rhs[i] /= v[i];
    168         }
    169         return rhs;
    170     }
    171 
    172     /* compound assignment from a another vector of the same type.
    173      * These operators can be used for implicit conversion and  handle operations
    174      * like "vector *= scalar" by letting the compiler implicitly convert a scalar
    175      * to a vector (assuming the BASE<T> allows it).
    176      */
    177     BASE<T>& operator *= (const BASE<T>& v) {
    178         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    179         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    180             rhs[i] *= v[i];
    181         }
    182         return rhs;
    183     }
    184     BASE<T>& operator /= (const BASE<T>& v) {
    185         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    186         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    187             rhs[i] /= v[i];
    188         }
    189         return rhs;
    190     }
    191 
    192     /*
    193      * NOTE: the functions below ARE NOT member methods. They are friend functions
    194      * with they definition inlined with their declaration. This makes these
    195      * template functions available to the compiler when (and only when) this class
    196      * is instantiated, at which point they're only templated on the 2nd parameter
    197      * (the first one, BASE<T> being known).
    198      */
    199 
    200     /* The operators below handle operation between vectors of the same side
    201      * but of a different element type.
    202      */
    203     template<typename RT>
    204     friend inline
    205     BASE<T> PURE operator *(const BASE<T>& lv, const BASE<RT>& rv) {
    206         return BASE<T>(lv) *= rv;
    207     }
    208     template<typename RT>
    209     friend inline
    210     BASE<T> PURE operator /(const BASE<T>& lv, const BASE<RT>& rv) {
    211         return BASE<T>(lv) /= rv;
    212     }
    213 
    214     /* The operators below (which are not templates once this class is instanced,
    215      * i.e.: BASE<T> is known) can be used for implicit conversion on both sides.
    216      * These handle operations like "vector * scalar" and "scalar * vector" by
    217      * letting the compiler implicitly convert a scalar to a vector (assuming
    218      * the BASE<T> allows it).
    219      */
    220     friend inline
    221     BASE<T> PURE operator *(const BASE<T>& lv, const BASE<T>& rv) {
    222         return BASE<T>(lv) *= rv;
    223     }
    224     friend inline
    225     BASE<T> PURE operator /(const BASE<T>& lv, const BASE<T>& rv) {
    226         return BASE<T>(lv) /= rv;
    227     }
    228 };
    229 
    230 /*
    231  * TVecUnaryOperators implements unary operators on a vector of type BASE<T>.
    232  *
    233  * BASE only needs to implement operator[] and size().
    234  * By simply inheriting from TVecUnaryOperators<BASE, T> BASE will automatically
    235  * get all the functionality here.
    236  *
    237  * These operators are implemented as friend functions of TVecUnaryOperators<BASE, T>
    238  */
    239 template <template<typename T> class BASE, typename T>
    240 class TVecUnaryOperators {
    241 public:
    242     BASE<T>& operator ++ () {
    243         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    244         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    245             ++rhs[i];
    246         }
    247         return rhs;
    248     }
    249     BASE<T>& operator -- () {
    250         BASE<T>& rhs = static_cast<BASE<T>&>(*this);
    251         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    252             --rhs[i];
    253         }
    254         return rhs;
    255     }
    256     BASE<T> operator - () const {
    257         BASE<T> r(BASE<T>::NO_INIT);
    258         BASE<T> const& rv(static_cast<BASE<T> const&>(*this));
    259         for (size_t i=0 ; i<BASE<T>::size() ; i++) {
    260             r[i] = -rv[i];
    261         }
    262         return r;
    263     }
    264 };
    265 
    266 
    267 /*
    268  * TVecComparisonOperators implements relational/comparison operators
    269  * on a vector of type BASE<T>.
    270  *
    271  * BASE only needs to implement operator[] and size().
    272  * By simply inheriting from TVecComparisonOperators<BASE, T> BASE will automatically
    273  * get all the functionality here.
    274  */
    275 template <template<typename T> class BASE, typename T>
    276 class TVecComparisonOperators {
    277 public:
    278     /*
    279      * NOTE: the functions below ARE NOT member methods. They are friend functions
    280      * with they definition inlined with their declaration. This makes these
    281      * template functions available to the compiler when (and only when) this class
    282      * is instantiated, at which point they're only templated on the 2nd parameter
    283      * (the first one, BASE<T> being known).
    284      */
    285     template<typename RT>
    286     friend inline
    287     bool PURE operator ==(const BASE<T>& lv, const BASE<RT>& rv) {
    288         for (size_t i = 0; i < BASE<T>::size(); i++)
    289             if (lv[i] != rv[i])
    290                 return false;
    291         return true;
    292     }
    293 
    294     template<typename RT>
    295     friend inline
    296     bool PURE operator !=(const BASE<T>& lv, const BASE<RT>& rv) {
    297         return !operator ==(lv, rv);
    298     }
    299 
    300     template<typename RT>
    301     friend inline
    302     bool PURE operator >(const BASE<T>& lv, const BASE<RT>& rv) {
    303         for (size_t i = 0; i < BASE<T>::size(); i++)
    304             if (lv[i] <= rv[i])
    305                 return false;
    306         return true;
    307     }
    308 
    309     template<typename RT>
    310     friend inline
    311     bool PURE operator <=(const BASE<T>& lv, const BASE<RT>& rv) {
    312         return !(lv > rv);
    313     }
    314 
    315     template<typename RT>
    316     friend inline
    317     bool PURE operator <(const BASE<T>& lv, const BASE<RT>& rv) {
    318         for (size_t i = 0; i < BASE<T>::size(); i++)
    319             if (lv[i] >= rv[i])
    320                 return false;
    321         return true;
    322     }
    323 
    324     template<typename RT>
    325     friend inline
    326     bool PURE operator >=(const BASE<T>& lv, const BASE<RT>& rv) {
    327         return !(lv < rv);
    328     }
    329 };
    330 
    331 
    332 /*
    333  * TVecFunctions implements functions on a vector of type BASE<T>.
    334  *
    335  * BASE only needs to implement operator[] and size().
    336  * By simply inheriting from TVecFunctions<BASE, T> BASE will automatically
    337  * get all the functionality here.
    338  */
    339 template <template<typename T> class BASE, typename T>
    340 class TVecFunctions {
    341 public:
    342     /*
    343      * NOTE: the functions below ARE NOT member methods. They are friend functions
    344      * with they definition inlined with their declaration. This makes these
    345      * template functions available to the compiler when (and only when) this class
    346      * is instantiated, at which point they're only templated on the 2nd parameter
    347      * (the first one, BASE<T> being known).
    348      */
    349     template<typename RT>
    350     friend inline
    351     T PURE dot(const BASE<T>& lv, const BASE<RT>& rv) {
    352         T r(0);
    353         for (size_t i = 0; i < BASE<T>::size(); i++)
    354             r += lv[i]*rv[i];
    355         return r;
    356     }
    357 
    358     friend inline
    359     T PURE length(const BASE<T>& lv) {
    360         return sqrt( dot(lv, lv) );
    361     }
    362 
    363     template<typename RT>
    364     friend inline
    365     T PURE distance(const BASE<T>& lv, const BASE<RT>& rv) {
    366         return length(rv - lv);
    367     }
    368 
    369     friend inline
    370     BASE<T> PURE normalize(const BASE<T>& lv) {
    371         return lv * (1 / length(lv));
    372     }
    373 };
    374 
    375 #undef PURE
    376 
    377 // -------------------------------------------------------------------------------------
    378 }; // namespace android
    379 
    380 
    381 #endif /* UI_TVEC_HELPERS_H */
    382