// Copyright 2019 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 rr_Traits_hpp
#define rr_Traits_hpp

#include <stdint.h>
#include <type_traits>

#ifdef Bool
#	undef Bool  // b/127920555
#endif

namespace rr {

// Forward declarations
class Value;

class Void;
class Bool;
class Byte;
class SByte;
class Short;
class UShort;
class Int;
class UInt;
class Long;
class Half;
class Float;
class Float4;

template<class T>
class Pointer;
template<class T>
class LValue;
template<class T>
class RValue;

// enabled_if_t is identical to C++14's std::enable_if_t.
// std::enable_if_t was introduced in C++14, but Reactor must support
// C++11.
template<bool Condition, class TrueType = void>
using enable_if_t = typename std::enable_if<Condition, TrueType>::type;

// IsDefined<T>::value is true if T is a valid type, otherwise false.
template<typename T, typename Enable = void>
struct IsDefined
{
	static constexpr bool value = false;
};

template<typename T>
struct IsDefined<T, enable_if_t<(sizeof(T) > 0)>>
{
	static constexpr bool value = true;
};

template<>
struct IsDefined<void>
{
	static constexpr bool value = true;
};

// CToReactorT<T> resolves to the corresponding Reactor type for the given C
// template type T.
template<typename T, typename ENABLE = void>
struct CToReactor;
template<typename T>
using CToReactorT = typename CToReactor<T>::type;

// CToReactor specializations for POD types.
template<>
struct CToReactor<void>
{
	using type = Void;
};
template<>
struct CToReactor<bool>
{
	using type = Bool;
	static Bool cast(bool);
};
template<>
struct CToReactor<uint8_t>
{
	using type = Byte;
	static Byte cast(uint8_t);
};
template<>
struct CToReactor<int8_t>
{
	using type = SByte;
	static SByte cast(int8_t);
};
template<>
struct CToReactor<int16_t>
{
	using type = Short;
	static Short cast(int16_t);
};
template<>
struct CToReactor<uint16_t>
{
	using type = UShort;
	static UShort cast(uint16_t);
};
template<>
struct CToReactor<int32_t>
{
	using type = Int;
	static Int cast(int32_t);
};
template<>
struct CToReactor<uint32_t>
{
	using type = UInt;
	static UInt cast(uint32_t);
};
template<>
struct CToReactor<float>
{
	using type = Float;
	static Float cast(float);
};
template<>
struct CToReactor<float[4]>
{
	using type = Float4;
	static Float4 cast(float[4]);
};

// TODO: Long has no constructor that takes a uint64_t
template<>
struct CToReactor<uint64_t>
{
	using type = Long; /* static Long   cast(uint64_t); */
};

// HasReactorType<T>::value resolves to true iff there exists a
// CToReactorT specialization for type T.
template<typename T>
using HasReactorType = IsDefined<CToReactorT<T>>;

// CToReactorPtr<T>::type resolves to the corresponding Reactor Pointer<>
// type for T*.
// For T types that have a CToReactorT<> specialization,
// CToReactorPtr<T>::type resolves to Pointer< CToReactorT<T> >, otherwise
// CToReactorPtr<T>::type resolves to Pointer<Byte>.
template<typename T, typename ENABLE = void>
struct CToReactorPtr
{
	using type = Pointer<Byte>;
	static inline type cast(const T *v);  // implemented in Traits.inl
};

// CToReactorPtr specialization for T types that have a CToReactorT<>
// specialization.
template<typename T>
struct CToReactorPtr<T, enable_if_t<HasReactorType<T>::value>>
{
	using type = Pointer<CToReactorT<T>>;
	static inline type cast(const T *v);  // implemented in Traits.inl
};

// CToReactorPtr specialization for void*.
// Maps to Pointer<Byte> instead of Pointer<Void>.
template<>
struct CToReactorPtr<void, void>
{
	using type = Pointer<Byte>;
	static inline type cast(const void *v);  // implemented in Traits.inl
};

// CToReactorPtr specialization for function pointer types.
// Maps to Pointer<Byte>.
// Drops the 'const' qualifier from the cast() method to avoid warnings
// about const having no meaning for function types.
template<typename T>
struct CToReactorPtr<T, enable_if_t<std::is_function<T>::value>>
{
	using type = Pointer<Byte>;
	static inline type cast(T *v);  // implemented in Traits.inl
};

template<typename T>
using CToReactorPtrT = typename CToReactorPtr<T>::type;

// CToReactor specialization for pointer types.
// For T types that have a CToReactorT<> specialization,
// CToReactorT<T*>::type resolves to Pointer< CToReactorT<T> >, otherwise
// CToReactorT<T*>::type resolves to Pointer<Byte>.
template<typename T>
struct CToReactor<T, enable_if_t<std::is_pointer<T>::value>>
{
	using elem = typename std::remove_pointer<T>::type;
	using type = CToReactorPtrT<elem>;
	static inline type cast(T v);  // implemented in Traits.inl
};

// CToReactor specialization for enum types.
template<typename T>
struct CToReactor<T, enable_if_t<std::is_enum<T>::value>>
{
	using underlying = typename std::underlying_type<T>::type;
	using type = CToReactorT<underlying>;
	static type cast(T v);  // implemented in Traits.inl
};

// IsRValue::value is true if T is of type RValue<X>, where X is any type.
template<typename T, typename Enable = void>
struct IsRValue
{
	static constexpr bool value = false;
};
template<typename T>
struct IsRValue<T, enable_if_t<IsDefined<typename T::rvalue_underlying_type>::value>>
{
	static constexpr bool value = true;
};

// IsLValue::value is true if T is of, or derives from type LValue<T>.
template<typename T>
struct IsLValue
{
	static constexpr bool value = std::is_base_of<LValue<T>, T>::value;
};

// IsReference::value is true if T is of type Reference<X>, where X is any type.
template<typename T, typename Enable = void>
struct IsReference
{
	static constexpr bool value = false;
};
template<typename T>
struct IsReference<T, enable_if_t<IsDefined<typename T::reference_underlying_type>::value>>
{
	static constexpr bool value = true;
};

// ReactorTypeT<T> returns the LValue Reactor type for T.
// T can be a C-type, RValue or LValue.
template<typename T, typename ENABLE = void>
struct ReactorType;
template<typename T>
using ReactorTypeT = typename ReactorType<T>::type;
template<typename T>
struct ReactorType<T, enable_if_t<IsDefined<CToReactorT<T>>::value>>
{
	using type = CToReactorT<T>;
	static type cast(T v) { return CToReactor<T>::cast(v); }
};
template<typename T>
struct ReactorType<T, enable_if_t<IsRValue<T>::value>>
{
	using type = typename T::rvalue_underlying_type;
	static type cast(T v) { return type(v); }
};
template<typename T>
struct ReactorType<T, enable_if_t<IsLValue<T>::value>>
{
	using type = T;
	static type cast(T v) { return type(v); }
};
template<typename T>
struct ReactorType<T, enable_if_t<IsReference<T>::value>>
{
	using type = T;
	static type cast(T v) { return type(v); }
};

// Reactor types that can be used as a return type for a function.
template<typename T>
struct CanBeUsedAsReturn
{
	static constexpr bool value = false;
};
template<>
struct CanBeUsedAsReturn<Void>
{
	static constexpr bool value = true;
};
template<>
struct CanBeUsedAsReturn<Int>
{
	static constexpr bool value = true;
};
template<>
struct CanBeUsedAsReturn<UInt>
{
	static constexpr bool value = true;
};
template<>
struct CanBeUsedAsReturn<Float>
{
	static constexpr bool value = true;
};
template<typename T>
struct CanBeUsedAsReturn<Pointer<T>>
{
	static constexpr bool value = true;
};

// Reactor types that can be used as a parameter types for a function.
template<typename T>
struct CanBeUsedAsParameter
{
	static constexpr bool value = false;
};
template<>
struct CanBeUsedAsParameter<Int>
{
	static constexpr bool value = true;
};
template<>
struct CanBeUsedAsParameter<UInt>
{
	static constexpr bool value = true;
};
template<>
struct CanBeUsedAsParameter<Float>
{
	static constexpr bool value = true;
};
template<typename T>
struct CanBeUsedAsParameter<Pointer<T>>
{
	static constexpr bool value = true;
};

// AssertParameterTypeIsValid statically asserts that all template parameter
// types can be used as a Reactor function parameter.
template<typename T, typename... other>
struct AssertParameterTypeIsValid : AssertParameterTypeIsValid<other...>
{
	static_assert(CanBeUsedAsParameter<T>::value, "Invalid parameter type");
};
template<typename T>
struct AssertParameterTypeIsValid<T>
{
	static_assert(CanBeUsedAsParameter<T>::value, "Invalid parameter type");
};

// AssertFunctionSignatureIsValid statically asserts that the Reactor
// function signature is valid.
template<typename Return, typename... Arguments>
class AssertFunctionSignatureIsValid;
template<typename Return>
class AssertFunctionSignatureIsValid<Return(Void)>
{};
template<typename Return, typename... Arguments>
class AssertFunctionSignatureIsValid<Return(Arguments...)>
{
	static_assert(CanBeUsedAsReturn<Return>::value, "Invalid return type");
	static_assert(sizeof(AssertParameterTypeIsValid<Arguments...>) >= 0, "");
};

}  // namespace rr

#endif  // rr_Traits_hpp
