// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// 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.

#ifndef sw_Types_hpp
#define sw_Types_hpp

#include <limits>
#include <type_traits>

// GCC warns against bitfields not fitting the entire range of an enum with a fixed underlying type of unsigned int, which gets promoted to an error with -Werror and cannot be suppressed.
// However, GCC already defaults to using unsigned int as the underlying type of an unscoped enum without a fixed underlying type. So we can just omit it.
#if defined(__GNUC__) && !defined(__clang__)
namespace {enum E {}; static_assert(!std::numeric_limits<std::underlying_type<E>::type>::is_signed, "expected unscoped enum whose underlying type is not fixed to be unsigned");}
#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT
#else
#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT : unsigned int
#endif

#if defined(_MSC_VER)
	typedef signed __int8 int8_t;
	typedef signed __int16 int16_t;
	typedef signed __int32 int32_t;
	typedef signed __int64 int64_t;
	typedef unsigned __int8 uint8_t;
	typedef unsigned __int16 uint16_t;
	typedef unsigned __int32 uint32_t;
	typedef unsigned __int64 uint64_t;
	#define ALIGN(bytes, type) __declspec(align(bytes)) type
#else
	#include <stdint.h>
	#define ALIGN(bytes, type) type __attribute__((aligned(bytes)))
#endif

namespace sw {

typedef ALIGN(1, uint8_t) byte;
typedef ALIGN(2, uint16_t) word;
typedef ALIGN(4, uint32_t) dword;
typedef ALIGN(8, uint64_t) qword;
typedef ALIGN(1, int8_t) sbyte;

template<typename T, int N>
struct alignas(sizeof(T)* N) vec
{
	vec() = default;

	vec(T replicate)
	{
		for(int i = 0; i < N; i++)
		{
			v[i] = replicate;
		}
	}

	template<typename ... ARGS>
	constexpr vec(T arg0, ARGS ... args)
		: v{ arg0, args... }
	{
	}

	T &operator[](int i)
	{
		return v[i];
	}

	const T &operator[](int i) const
	{
		return v[i];
	}

	T v[N];
};

template<typename T>
struct alignas(sizeof(T) * 4) vec<T, 4>
{
	vec() = default;

	constexpr vec(T replicate)
		: x(replicate), y(replicate), z(replicate), w(replicate)
	{
	}

	constexpr vec(T x, T y, T z, T w)
		: x(x), y(y), z(z), w(w)
	{
	}

	T &operator[](int i)
	{
		return v[i];
	}

	const T &operator[](int i) const
	{
		return v[i];
	}

	union
	{
		T v[4];

		struct
		{
			T x;
			T y;
			T z;
			T w;
		};
	};
};

template<typename T, int N>
bool operator==(const vec<T, N>& a, const vec<T, N>& b)
{
	for(int i = 0; i < N; i++)
	{
		if(a.v[i] != b.v[i])
		{
			return false;
		}
	}

	return true;
}

template<typename T, int N>
bool operator!=(const vec<T, N>& a, const vec<T, N>& b)
{
	return !(a == b);
}

template<typename T> using vec2 = vec<T, 2>;
template<typename T> using vec4 = vec<T, 4>;
template<typename T> using vec8 = vec<T, 8>;
template<typename T> using vec16 = vec<T, 16>;

using int2 = vec2<int>;
using uint2 = vec2<unsigned int>;
using float2 = vec2<float>;
using dword2 = vec2<dword>;
using qword2 = vec2<qword>;

using int4 = vec4<int>;
using uint4 = vec4<unsigned int>;
using float4 = vec4<float>;
using byte4 = vec4<byte>;
using sbyte4 = vec4<sbyte>;
using short4 = vec4<short>;
using ushort4 = vec4<unsigned short>;
using word4 = vec4<word>;
using dword4 = vec4<dword>;

using byte8 = vec8<byte>;
using sbyte8 = vec8<sbyte>;
using short8 = vec8<short>;
using ushort8 = vec8<unsigned short>;

using byte16 = vec16<byte>;
using sbyte16 = vec16<sbyte>;

inline constexpr float4 vector(float x, float y, float z, float w)
{
	return float4{ x, y, z, w };
}

inline constexpr float4 replicate(float f)
{
	return vector(f, f, f, f);
}

#define OFFSET(s,m) (int)(size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))

}  // namespace sw

#endif   // sw_Types_hpp
