-
Mark Winter authoredMark Winter authored
LinkageTraitTfms.h 3.15 KiB
#pragma once
#include "../Cuda/ImageView.h"
#include "ScriptTraits.h"
#include <type_traits>
// These type-transforms are used to build concrete arguments
// for autogenerated cuda-library stubs
namespace CudaLibrary
{
// Use script defined scalar/vector/image/deferred traits
template <typename T> using OutParam = Script::OutParam<T>;
template <typename T> using InParam = Script::InParam<T>;
template <typename T> using OptParam = Script::OptParam<T>;
template <typename T> using ImageRef = Script::ImageRef<T>;
template <typename T> using Image = Script::Image<T>;
template <typename T> using Vector = Script::Vector<T>;
template <typename T> using Scalar = Script::Scalar<T>;
using DeferredType = Script::DeferredType;
/////////////////////////
// dtrait_to_concrete_linkage -
// Transforms from data-trait type to concrete linkage type (T replaces deferred type)
// (e.g. ImageRef<int> -> ImageView<int>)
/////////////////////////
template <typename Traits, typename T>
struct dtrait_to_concrete_link {};
template <typename BaseType, typename T>
struct dtrait_to_concrete_link<Scalar<BaseType>,T>
{
using type = BaseType;
};
template <typename T>
struct dtrait_to_concrete_link<Scalar<DeferredType>,T>
{
using type = T;
};
template <typename BaseType, typename T>
struct dtrait_to_concrete_link<Vector<BaseType>,T>
{
using type = Vec<BaseType>;
};
template <typename T>
struct dtrait_to_concrete_link<Vector<DeferredType>,T>
{
using type = Vec<T>;
};
template <typename BaseType, typename T>
struct dtrait_to_concrete_link<Image<BaseType>,T>
{
using type = ImageView<BaseType>;
};
template <typename T>
struct dtrait_to_concrete_link<Image<DeferredType>,T>
{
using type = ImageView<T>;
};
template <typename BaseType, typename T>
struct dtrait_to_concrete_link<ImageRef<BaseType>,T>
{
using type = ImageView<BaseType>;
};
template <typename T>
struct dtrait_to_concrete_link<ImageRef<DeferredType>,T>
{
using type = ImageView<T>;
};
/////////////////////////
// iotrait_to_concrete -
// Transforms from full io-trait types to concrete base types
// (e.g. InParam<Image<int>> -> ImageContainer<int>)
// NOTE: This leaves deferred types the same as iotrait_to_script
/////////////////////////
template <typename Traits, typename OutT, typename InT>
struct iotrait_to_concrete_link {};
template <template <typename> class IOTrait, template <typename> class DataTrait,
typename BaseType, typename OutT, typename InT>
struct iotrait_to_concrete_link<IOTrait<DataTrait<BaseType>>,OutT,InT>
{
// TODO: Fix script to concrete transform (ImageView/Owner) so we can use const& here
using type = typename dtrait_to_concrete_link<DataTrait<BaseType>,InT>::type;
};
template <template <typename> class DataTrait,
typename BaseType, typename OutT, typename InT>
struct iotrait_to_concrete_link<OutParam<DataTrait<BaseType>>,OutT,InT>
{
using type = typename std::add_lvalue_reference<
typename dtrait_to_concrete_link<DataTrait<BaseType>,OutT>::type
>::type;
};
template <typename Traits, typename OutT, typename InT>
using link_tfm = typename iotrait_to_concrete_link<Traits,OutT,InT>::type;
};