summaryrefslogtreecommitdiff
path: root/modules/lang/c++/c_transfer.hpp
blob: 953f7328ef77771331f863fb9d77b675e0c2a664 (plain)
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
#pragma once

#include "language.hpp"
#include "c_types.hpp"

namespace saw {
namespace impl {
template<typename T, typename Enc>
struct c_transfer_generater;

template<typename T, typename Enc>
struct c_transfer_generater<T,Enc> {
public:
	static error_or<void> apply (const lang_c::config& cfg, lang_c::transfer_binding_state& state){

		return make_error<err::not_implemented>();
	}
};

template<typename... TransTypes, typename Enc>
struct c_transfer_generater<tmpl_group<TransTypes...>, Enc> {
private:
	// Not used currently
	using ReducedTmplGroup = typename tmpl_reduce<tmpl_group<TransTypes...>>::type;
private:
	template<uint64_t i>
	static error_or<void> apply_ele(const lang_c::config& cfg, lang_c::transfer_binding_state& state){
		if constexpr ( i < sizeof...(TransTypes)){
			{
				using pType = typename parameter_pack_type<i, TransTypes...>::type;
				auto eov = c_transfer_generater<pType, Enc>::apply(cfg,state);
				if(eov.is_error()){
					return eov;
				}
			}
			return apply_ele<i+1u>(cfg,state);
		}
		return make_void();
	}
public:
	static error_or<void> apply(const lang_c::config& cfg, lang_c::transfer_binding_state& state){
		return apply_ele<0u>(cfg, state);
	}
};
}
}