#ifndef S2_UTIL_MATH_VECTOR_H_
#define S2_UTIL_MATH_VECTOR_H_
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <cstdlib>
#include <iosfwd>
#include <iostream>
#include <limits>
#include <type_traits>
#include "base/check_op.h"
template <typename T>
class Vector2;
template <typename T>
class Vector3;
template <typename T>
class Vector4;
namespace util {
namespace math {
namespace internal_vector {
template <std::size_t... Is>
struct IdxSeq { … };
template <std::size_t M, std::size_t... Is>
struct MkIdxSeq : MkIdxSeq<M - 1, M - 1, Is...> { … };
MkIdxSeq<0, Is...>;
template <template <typename> class VecTemplate, typename T, std::size_t N>
class BasicVector { … };
template <typename K,
template <typename> class VT2,
typename T2,
std::size_t N2>
VT2<T2> operator*(const K& k, const BasicVector<VT2, T2, N2>& a) { … }
template <typename K,
template <typename> class VT2,
typename T2,
std::size_t N2>
VT2<T2> operator/(const K& k, const BasicVector<VT2, T2, N2>& a) { … }
}
}
}
template <typename T>
class Vector2 : public util::math::internal_vector::BasicVector<Vector2, T, 2> { … };
template <typename T>
class Vector3 : public util::math::internal_vector::BasicVector<Vector3, T, 3> { … };
template <typename T>
class Vector4 : public util::math::internal_vector::BasicVector<Vector4, T, 4> { … };
Vector2_b;
Vector2_i;
Vector2_f;
Vector2_d;
Vector3_b;
Vector3_i;
Vector3_f;
Vector3_d;
Vector4_b;
Vector4_i;
Vector4_f;
Vector4_d;
#endif