Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#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;
};