///////////////////////////////////////////////////////////////////////////////////
/// OpenGL Mathematics (glm.g-truc.net)
///
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
///
/// Restrictions:
///             By making use of the Software for military purposes, you choose to make
///             a Bunny unhappy.
///
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
///
/// @ref gtx_type_aligned
/// @file glm/gtx/type_aligned.hpp
/// @date 2014-11-23 / 2014-12-23
/// @author Christophe Riccio
///
/// @see core (dependence)
/// @see gtc_quaternion (dependence)
///
/// @defgroup gtx_type_aligned GLM_GTX_type_aligned
/// @ingroup gtx
///
/// @brief Defines aligned types.
///
/// @ref core_precision defines aligned types.
///
/// <glm/gtx/type_aligned.hpp> need to be included to use these functionalities.
///////////////////////////////////////////////////////////////////////////////////

#pragma once

// Dependency:
#include "../gtc/type_precision.hpp"

#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
#       pragma message("GLM: GLM_GTX_type_aligned extension included")
#endif

namespace glm
{
        ///////////////////////////
        // Signed int vector types

        /// @addtogroup gtx_type_aligned
        /// @{

        /// Low precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1);

        /// Low precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2);

        /// Low precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4);

        /// Low precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8);


        /// Low precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1);

        /// Low precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2);

        /// Low precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4);

        /// Low precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8);


        /// Low precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1);

        /// Low precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2);

        /// Low precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4);

        /// Low precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8);


        /// Medium precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1);

        /// Medium precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2);

        /// Medium precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4);

        /// Medium precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8);


        /// Medium precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1);

        /// Medium precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2);

        /// Medium precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4);

        /// Medium precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8);


        /// Medium precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1);

        /// Medium precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2);

        /// Medium precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4);

        /// Medium precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8);


        /// High precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1);

        /// High precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2);

        /// High precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4);

        /// High precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8);


        /// High precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1);

        /// High precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2);

        /// High precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4);

        /// High precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8);


        /// High precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1);

        /// High precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2);

        /// High precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4);

        /// High precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8);


        /// Default precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1);

        /// Default precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2);

        /// Default precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4);

        /// Default precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8);


        /// Default precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1);

        /// Default precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2);

        /// Default precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4);

        /// Default precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8);


        /// Default precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1);

        /// Default precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2);

        /// Default precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4);

        /// Default precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8);


        /// Default precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4);
       
        /// Default precision 32 bit signed integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8);

        /// Default precision 32 bit signed integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16);

        /// Default precision 32 bit signed integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16);


        /// Default precision 8 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1);

        /// Default precision 8 bit signed integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2);

        /// Default precision 8 bit signed integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4);

        /// Default precision 8 bit signed integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4);


        /// Default precision 16 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2);
       
        /// Default precision 16 bit signed integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4);

        /// Default precision 16 bit signed integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8);

        /// Default precision 16 bit signed integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8);


        /// Default precision 32 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4);
       
        /// Default precision 32 bit signed integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8);

        /// Default precision 32 bit signed integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16);

        /// Default precision 32 bit signed integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16);


        /// Default precision 64 bit signed integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8);
       
        /// Default precision 64 bit signed integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16);

        /// Default precision 64 bit signed integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32);

        /// Default precision 64 bit signed integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32);


        /////////////////////////////
        // Unsigned int vector types

        /// Low precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1);

        /// Low precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2);

        /// Low precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4);

        /// Low precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8);


        /// Low precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1);

        /// Low precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2);

        /// Low precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4);

        /// Low precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8);


        /// Low precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1);

        /// Low precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2);

        /// Low precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4);

        /// Low precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8);


        /// Medium precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1);

        /// Medium precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2);

        /// Medium precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4);

        /// Medium precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8);


        /// Medium precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1);

        /// Medium precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2);

        /// Medium precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4);

        /// Medium precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8);


        /// Medium precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1);

        /// Medium precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2);

        /// Medium precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4);

        /// Medium precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8);


        /// High precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1);

        /// High precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2);

        /// High precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4);

        /// High precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8);


        /// High precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1);

        /// High precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2);

        /// High precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4);

        /// High precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8);


        /// High precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1);

        /// High precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2);

        /// High precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4);

        /// High precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8);


        /// Default precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1);

        /// Default precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2);

        /// Default precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4);

        /// Default precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8);


        /// Default precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1);

        /// Default precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2);

        /// Default precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4);

        /// Default precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8);


        /// Default precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1);

        /// Default precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2);

        /// Default precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4);

        /// Default precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8);


        /// Default precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4);
       
        /// Default precision 32 bit unsigned integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8);

        /// Default precision 32 bit unsigned integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16);

        /// Default precision 32 bit unsigned integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16);


        /// Default precision 8 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1);

        /// Default precision 8 bit unsigned integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2);

        /// Default precision 8 bit unsigned integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4);

        /// Default precision 8 bit unsigned integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4);


        /// Default precision 16 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2);
       
        /// Default precision 16 bit unsigned integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4);

        /// Default precision 16 bit unsigned integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8);

        /// Default precision 16 bit unsigned integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8);


        /// Default precision 32 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4);
       
        /// Default precision 32 bit unsigned integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8);

        /// Default precision 32 bit unsigned integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16);

        /// Default precision 32 bit unsigned integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16);


        /// Default precision 64 bit unsigned integer aligned scalar type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8);
       
        /// Default precision 64 bit unsigned integer aligned vector of 2 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16);

        /// Default precision 64 bit unsigned integer aligned vector of 3 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32);

        /// Default precision 64 bit unsigned integer aligned vector of 4 components type.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32);


        //////////////////////
        // Float vector types

        /// 32 bit single-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4);

        /// 64 bit double-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8);


        /// 32 bit single-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4);

        /// 64 bit double-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8);


        /// 32 bit single-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4);

        /// 64 bit double-precision floating-point aligned scalar.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8);


        /// Single-precision floating-point aligned vector of 1 component.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4);

        /// Single-precision floating-point aligned vector of 2 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8);

        /// Single-precision floating-point aligned vector of 3 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16);

        /// Single-precision floating-point aligned vector of 4 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16);


        /// Single-precision floating-point aligned vector of 1 component.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4);

        /// Single-precision floating-point aligned vector of 2 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8);

        /// Single-precision floating-point aligned vector of 3 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16);

        /// Single-precision floating-point aligned vector of 4 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16);

       
        /// Single-precision floating-point aligned vector of 1 component.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4);

        /// Single-precision floating-point aligned vector of 2 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8);

        /// Single-precision floating-point aligned vector of 3 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16);

        /// Single-precision floating-point aligned vector of 4 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16);


        /// Double-precision floating-point aligned vector of 1 component.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8);

        /// Double-precision floating-point aligned vector of 2 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16);

        /// Double-precision floating-point aligned vector of 3 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32);

        /// Double-precision floating-point aligned vector of 4 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32);


        /// Double-precision floating-point aligned vector of 1 component.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8);

        /// Double-precision floating-point aligned vector of 2 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16);

        /// Double-precision floating-point aligned vector of 3 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32);

        /// Double-precision floating-point aligned vector of 4 components.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32);


        //////////////////////
        // Float matrix types

        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef detail::tmat1<f32> mat1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16);


        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef detail::tmat1x1<f32> mat1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16);


        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef detail::tmat1x1<f32> fmat1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16);


        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef f32 fmat1x1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16);

        /// Single-precision floating-point aligned 2x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16);

        /// Single-precision floating-point aligned 2x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16);

        /// Single-precision floating-point aligned 3x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16);

        /// Single-precision floating-point aligned 3x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16);

        /// Single-precision floating-point aligned 4x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16);

        /// Single-precision floating-point aligned 4x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16);


        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef detail::tmat1x1<f32, defaultp> f32mat1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16);


        /// Single-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef f32 f32mat1x1;

        /// Single-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16);

        /// Single-precision floating-point aligned 2x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16);

        /// Single-precision floating-point aligned 2x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16);

        /// Single-precision floating-point aligned 3x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16);

        /// Single-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16);

        /// Single-precision floating-point aligned 3x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16);

        /// Single-precision floating-point aligned 4x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16);

        /// Single-precision floating-point aligned 4x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16);

        /// Single-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16);


        /// Double-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef detail::tmat1x1<f64, defaultp> f64mat1;

        /// Double-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32);

        /// Double-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32);

        /// Double-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32);


        /// Double-precision floating-point aligned 1x1 matrix.
        /// @see gtx_type_aligned
        //typedef f64 f64mat1x1;

        /// Double-precision floating-point aligned 2x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32);

        /// Double-precision floating-point aligned 2x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32);

        /// Double-precision floating-point aligned 2x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32);

        /// Double-precision floating-point aligned 3x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32);

        /// Double-precision floating-point aligned 3x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32);

        /// Double-precision floating-point aligned 3x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32);

        /// Double-precision floating-point aligned 4x2 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32);

        /// Double-precision floating-point aligned 4x3 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32);

        /// Double-precision floating-point aligned 4x4 matrix.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32);


        //////////////////////////
        // Quaternion types

        /// Single-precision floating-point aligned quaternion.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16);

        /// Single-precision floating-point aligned quaternion.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(fquat, aligned_fquat, 16);

        /// Double-precision floating-point aligned quaternion.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32);

        /// Single-precision floating-point aligned quaternion.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16);

        /// Double-precision floating-point aligned quaternion.
        /// @see gtx_type_aligned
        GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32);

        /// @}
}//namespace glm

#include "type_aligned.inl"