18 #include <hicn/transport/config.h>
19 #include <hicn/transport/core/content_object.h>
20 #include <hicn/transport/errors/not_implemented_exception.h>
21 #include <protocols/fec/rs.h>
24 #include <protocols/fec/rely.h>
35 #define foreach_fec_type foreach_rs_fec_type foreach_rely_fec_type
37 #define foreach_fec_type foreach_rs_fec_type
40 #define ENUM_FROM_MACRO(name, k, n) name##_K##k##_N##n
41 #define ENUM_FROM_MACRO_STR(name, k, n) #name "_K" #k "_N" #n
43 enum class FECType : uint8_t {
44 #define _(name, k, n) ENUM_FROM_MACRO(name, k, n),
50 #define ENUM_FROM_MACRO2(name, k, n) FECType::ENUM_FROM_MACRO(name, k, n)
54 static FECType fecTypeFromString(
const char *fec_type) {
55 #define _(name, k, n) \
57 if (strncmp(fec_type, ENUM_FROM_MACRO_STR(name, k, n), \
58 strlen(ENUM_FROM_MACRO_STR(name, k, n))) == 0) { \
59 return ENUM_FROM_MACRO2(name, k, n); \
65 return FECType::UNKNOWN;
68 static bool isFec(FECType fec_type, uint32_t index, uint32_t seq_offset = 0) {
70 #define _(name, k, n) \
71 case ENUM_FROM_MACRO2(name, k, n): \
72 return FecInfo<Code<k, n>>::isFec(index - (seq_offset % n));
76 default :
return false;
80 static uint32_t nextSource(FECType fec_type, uint32_t index,
81 uint32_t seq_offset = 0) {
83 #define _(name, k, n) \
84 case ENUM_FROM_MACRO2(name, k, n): \
85 return FecInfo<Code<k, n>>::nextSource(index) + (seq_offset % n);
89 default :
throw std::runtime_error(
"Unknown fec type");
93 static uint32_t getSourceSymbols(FECType fec_type) {
95 #define _(name, k, n) \
96 case ENUM_FROM_MACRO2(name, k, n): \
100 default :
throw std::runtime_error(
"Unknown fec type");
104 static uint32_t getBlockSymbols(FECType fec_type) {
106 #define _(name, k, n) \
107 case ENUM_FROM_MACRO2(name, k, n): \
111 default :
throw std::runtime_error(
"Unknown fec type");
115 static std::unique_ptr<ProducerFEC> getEncoder(FECType fec_type,
116 uint32_t seq_offset = 0) {
117 return factoryEncoder(fec_type, seq_offset);
120 static std::unique_ptr<ConsumerFEC> getDecoder(FECType fec_type,
121 uint32_t seq_offset = 0) {
122 return factoryDencoder(fec_type, seq_offset);
126 static std::unique_ptr<ProducerFEC> factoryEncoder(FECType fec_type,
127 uint32_t seq_offset) {
129 #define _(name, k, n) \
130 case ENUM_FROM_MACRO2(name, k, n): \
131 return std::make_unique<name##Encoder>(k, n, seq_offset);
135 default :
throw std::runtime_error(
"Unknown fec type");
139 static std::unique_ptr<ConsumerFEC> factoryDencoder(FECType fec_type,
140 uint32_t seq_offset) {
142 #define _(name, k, n) \
143 case ENUM_FROM_MACRO2(name, k, n): \
144 return std::make_unique<name##Decoder>(k, n, seq_offset);
148 default :
throw std::runtime_error(
"Unknown fec type");