// 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");
}  // namespace
#	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;

	constexpr explicit 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... }
	{
	}

	// Require explicit use of replicate constructor.
	vec &operator=(T) = delete;

	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 explicit 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)
	{
	}

	// Require explicit use of replicate constructor.
	vec &operator=(T) = delete;

	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
