/* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu-anonymous-struct" #pragma clang diagnostic ignored "-Wnested-anon-types" namespace android { // ------------------------------------------------------------------------------------- namespace details { template class TVec2 : public TVecProductOperators, public TVecAddOperators, public TVecUnaryOperators, public TVecComparisonOperators, public TVecFunctions, public TVecDebug { public: enum no_init { NO_INIT }; typedef T value_type; typedef T& reference; typedef T const& const_reference; typedef size_t size_type; union { struct { T x, y; }; struct { T s, t; }; struct { T r, g; }; }; static constexpr size_t SIZE = 2; inline constexpr size_type size() const { return SIZE; } // array access inline constexpr T const& operator[](size_t i) const { #if __cplusplus >= 201402L // only possible in C++0x14 with constexpr assert(i < SIZE); #endif return (&x)[i]; } inline T& operator[](size_t i) { assert(i < SIZE); return (&x)[i]; } // ----------------------------------------------------------------------- // we want the compiler generated versions for these... TVec2(const TVec2&) = default; ~TVec2() = default; TVec2& operator = (const TVec2&) = default; // constructors // leaves object uninitialized. use with caution. explicit constexpr TVec2(no_init) { } // default constructor constexpr TVec2() : x(0), y(0) { } // handles implicit conversion to a tvec4. must not be explicit. template::value >::type> constexpr TVec2(A v) : x(v), y(v) { } template constexpr TVec2(A x, B y) : x(x), y(y) { } template explicit constexpr TVec2(const TVec2& v) : x(v.x), y(v.y) { } // cross product works only on vectors of size 2 or 3 template friend inline constexpr value_type cross(const TVec2& u, const TVec2& v) { return value_type(u.x*v.y - u.y*v.x); } }; } // namespace details // ---------------------------------------------------------------------------------------- typedef details::TVec2 double2; typedef details::TVec2 float2; typedef details::TVec2 vec2; typedef details::TVec2 half2; typedef details::TVec2 int2; typedef details::TVec2 uint2; typedef details::TVec2 short2; typedef details::TVec2 ushort2; typedef details::TVec2 byte2; typedef details::TVec2 ubyte2; typedef details::TVec2 bool2; // ---------------------------------------------------------------------------------------- } // namespace android #pragma clang diagnostic pop