summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Habets <thomas@habets.se>2020-08-29 23:18:16 +0100
committerMartin Braun <martin@gnuradio.org>2020-09-07 05:14:14 -0700
commitd2c9de98b52e7e9a4918190b1e7079496d2a13b6 (patch)
tree74b9de2495d7e4ab79dd13bbf6338ca2fb1e2501
parent0d1d600ab622075a4e56e66642e67fc5c983450e (diff)
fec: Remove manual memory management
This removes almost all manual memory management in gr-fec/. `scl_list` is a bit of magic, so requires more thinking.
-rw-r--r--gr-fec/include/gnuradio/fec/cc_common.h6
-rw-r--r--gr-fec/include/gnuradio/fec/polar_decoder_sc.h4
-rw-r--r--gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h6
-rw-r--r--gr-fec/include/gnuradio/fec/polar_encoder.h9
-rw-r--r--gr-fec/include/gnuradio/fec/polar_encoder_systematic.h2
-rw-r--r--gr-fec/lib/cc_decoder_impl.cc42
-rw-r--r--gr-fec/lib/cc_decoder_impl.h6
-rw-r--r--gr-fec/lib/polar_decoder_sc.cc22
-rw-r--r--gr-fec/lib/polar_decoder_sc_systematic.cc28
-rw-r--r--gr-fec/lib/polar_encoder.cc36
-rw-r--r--gr-fec/lib/polar_encoder_systematic.cc14
-rw-r--r--gr-fec/lib/scl_list.h8
-rw-r--r--gr-fec/python/fec/bindings/polar_decoder_sc_python.cc2
-rw-r--r--gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc2
-rw-r--r--gr-fec/python/fec/bindings/polar_encoder_python.cc2
-rw-r--r--gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc2
16 files changed, 81 insertions, 110 deletions
diff --git a/gr-fec/include/gnuradio/fec/cc_common.h b/gr-fec/include/gnuradio/fec/cc_common.h
index 0ece003713..190897a8cd 100644
--- a/gr-fec/include/gnuradio/fec/cc_common.h
+++ b/gr-fec/include/gnuradio/fec/cc_common.h
@@ -11,6 +11,8 @@
#ifndef INCLUDED_FEC_CC_COMMON_H
#define INCLUDED_FEC_CC_COMMON_H
+#include <volk/volk_alloc.hh>
+
typedef enum _cc_mode_t {
CC_STREAMING = 0,
CC_TERMINATED,
@@ -31,10 +33,10 @@ typedef union {
} metric_t;
struct v {
- unsigned char* metrics;
+ volk::vector<unsigned char> metrics;
metric_t old_metrics, new_metrics, metrics1,
metrics2; /* Pointers to path metrics, swapped on every bit */
- unsigned char* decisions;
+ volk::vector<unsigned char> decisions;
};
#endif /*INCLUDED_FEC_CC_COMMON_H*/
diff --git a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
index 23886dc2f7..8a8cc49759 100644
--- a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
+++ b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
@@ -59,8 +59,8 @@ private:
std::vector<int> frozen_bit_positions,
std::vector<uint8_t> frozen_bit_values);
- float* d_llr_vec;
- unsigned char* d_u_hat_vec;
+ volk::vector<float> d_llr_vec;
+ volk::vector<unsigned char> d_u_hat_vec;
unsigned char retrieve_bit_from_llr(float llr, const int pos);
void sc_decode(float* llrs, unsigned char* u);
diff --git a/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h b/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h
index b001849cca..84011a0f69 100644
--- a/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h
+++ b/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h
@@ -57,9 +57,9 @@ private:
polar_decoder_sc_systematic(int block_size,
int num_info_bits,
std::vector<int> frozen_bit_positions);
- float* d_llr_vec;
- unsigned char* d_u_hat_vec;
- unsigned char* d_frame_vec;
+ volk::vector<float> d_llr_vec;
+ volk::vector<unsigned char> d_u_hat_vec;
+ volk::vector<unsigned char> d_frame_vec;
unsigned char retrieve_bit_from_llr(float llr, const int pos);
void sc_decode(float* llrs, unsigned char* u);
void extract_info_bits_reversed(unsigned char* outbuf, const unsigned char* inbuf);
diff --git a/gr-fec/include/gnuradio/fec/polar_encoder.h b/gr-fec/include/gnuradio/fec/polar_encoder.h
index c76a495050..6bd6afbe77 100644
--- a/gr-fec/include/gnuradio/fec/polar_encoder.h
+++ b/gr-fec/include/gnuradio/fec/polar_encoder.h
@@ -74,12 +74,13 @@ private:
bool is_packed);
bool d_is_packed;
- // c'tor method for packed algorithm setup.
- void setup_frozen_bit_inserter();
+ // Helper function to allow `d_frozen_bit_prototype` to be const.
+ volk::vector<unsigned char> make_prototype() const;
// methods insert input bits and frozen bits into packed array for encoding
- unsigned char* d_frozen_bit_prototype; // packed frozen bits are written onto it and
- // later copies are used.
+ const volk::vector<unsigned char>
+ d_frozen_bit_prototype; // packed frozen bits are written onto it and
+ // later copies are used.
void insert_packed_frozen_bits_and_reverse(unsigned char* target,
const unsigned char* input) const;
void insert_unpacked_bit_into_packed_array_at_position(unsigned char* target,
diff --git a/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h b/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h
index b4932b626a..0fe9e8ea09 100644
--- a/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h
+++ b/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h
@@ -70,7 +70,7 @@ private:
void bit_reverse_and_reset_frozen_bits(unsigned char* outbuf,
const unsigned char* inbuf);
- unsigned char* d_volk_syst_intermediate;
+ volk::vector<unsigned char> d_volk_syst_intermediate;
};
} // namespace code
diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc
index 2ff08e018d..21062e4f41 100644
--- a/gr-fec/lib/cc_decoder_impl.cc
+++ b/gr-fec/lib/cc_decoder_impl.cc
@@ -98,26 +98,13 @@ cc_decoder_impl::cc_decoder_impl(int frame_size,
throw std::runtime_error("cc_decoder: mode not recognized");
}
- d_vp.metrics = (unsigned char*)volk_malloc(2 * sizeof(unsigned char) * d_numstates,
- volk_get_alignment());
- if (d_vp.metrics == NULL) {
- throw std::runtime_error("bad alloc for d_vp.metrics!");
- }
-
- d_vp.metrics1.t = d_vp.metrics;
- d_vp.metrics2.t = d_vp.metrics + d_numstates;
+ d_vp.metrics.resize(2 * d_numstates);
+ d_vp.metrics1.t = d_vp.metrics.data();
+ d_vp.metrics2.t = d_vp.metrics.data() + d_numstates;
- d_vp.decisions = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * d_veclen * d_decision_t_size, volk_get_alignment());
- if (d_vp.decisions == NULL) {
- throw std::runtime_error("bad alloc for d_vp.decisions!");
- }
+ d_vp.decisions.resize(d_veclen * d_decision_t_size);
- Branchtab = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * d_numstates / 2 * rate, volk_get_alignment());
- if (Branchtab == NULL) {
- throw std::runtime_error("bad alloc for d_vp.decisions!");
- }
+ d_branchtab.resize(d_numstates / 2 * rate);
create_viterbi();
@@ -147,12 +134,7 @@ cc_decoder_impl::cc_decoder_impl(int frame_size,
}
}
-cc_decoder_impl::~cc_decoder_impl()
-{
- volk_free(d_vp.decisions);
- volk_free(Branchtab);
- volk_free(d_vp.metrics);
-}
+cc_decoder_impl::~cc_decoder_impl() {}
int cc_decoder_impl::get_output_size()
{
@@ -191,7 +173,7 @@ void cc_decoder_impl::create_viterbi()
partab_init();
for (state = 0; state < d_numstates / 2; state++) {
for (i = 0; i < d_rate; i++) {
- Branchtab[i * d_numstates / 2 + state] =
+ d_branchtab[i * d_numstates / 2 + state] =
(d_polys[i] < 0) ^ parity((2 * state) & abs(d_polys[i])) ? 255 : 0;
}
}
@@ -297,9 +279,7 @@ int cc_decoder_impl::find_endstate()
int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits)
{
- unsigned char* d;
-
- d = d_vp.decisions;
+ unsigned char* d = d_vp.decisions.data();
memset(d, 0, d_decision_t_size * nbits);
@@ -309,7 +289,7 @@ int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits)
d,
nbits - (d_k - 1),
d_k - 1,
- Branchtab);
+ d_branchtab.data());
return 0;
}
@@ -319,10 +299,8 @@ int cc_decoder_impl::chainback_viterbi(unsigned char* data,
unsigned int endstate,
unsigned int tailsize)
{
- unsigned char* d;
-
/* ADDSHIFT and SUBSHIFT make sure that the thing returned is a byte. */
- d = d_vp.decisions;
+ unsigned char* d = d_vp.decisions.data();
/* Make room beyond the end of the encoder register so we can
* accumulate a full byte of decoded data
*/
diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h
index e39cd9846a..d7d236da21 100644
--- a/gr-fec/lib/cc_decoder_impl.h
+++ b/gr-fec/lib/cc_decoder_impl.h
@@ -43,7 +43,7 @@ private:
unsigned int tailsize);
int find_endstate();
- unsigned char* Branchtab;
+ volk::vector<unsigned char> d_branchtab;
unsigned char Partab[256];
@@ -85,6 +85,10 @@ public:
bool padded = false);
~cc_decoder_impl();
+ // Disable copy because of the raw pointers.
+ cc_decoder_impl(const cc_decoder_impl&) = delete;
+ cc_decoder_impl& operator=(const cc_decoder_impl&) = delete;
+
void generic_work(void* inbuffer, void* outbuffer);
bool set_frame_size(unsigned int frame_size);
double rate();
diff --git a/gr-fec/lib/polar_decoder_sc.cc b/gr-fec/lib/polar_decoder_sc.cc
index 9d694bf3bb..eee78fabf8 100644
--- a/gr-fec/lib/polar_decoder_sc.cc
+++ b/gr-fec/lib/polar_decoder_sc.cc
@@ -37,30 +37,22 @@ polar_decoder_sc::polar_decoder_sc(int block_size,
std::vector<int> frozen_bit_positions,
std::vector<uint8_t> frozen_bit_values)
: polar_decoder_common(
- block_size, num_info_bits, frozen_bit_positions, frozen_bit_values)
+ block_size, num_info_bits, frozen_bit_positions, frozen_bit_values),
+ d_llr_vec(block_size * (block_power() + 1)),
+ d_u_hat_vec(block_size * (block_power() + 1))
{
- d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1));
- d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1));
}
-polar_decoder_sc::~polar_decoder_sc()
-{
- volk_free(d_llr_vec);
- volk_free(d_u_hat_vec);
-}
+polar_decoder_sc::~polar_decoder_sc() {}
void polar_decoder_sc::generic_work(void* in_buffer, void* out_buffer)
{
const float* in = (const float*)in_buffer;
unsigned char* out = (unsigned char*)out_buffer;
- initialize_decoder(d_u_hat_vec, d_llr_vec, in);
- sc_decode(d_llr_vec, d_u_hat_vec);
- extract_info_bits(out, d_u_hat_vec);
+ initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in);
+ sc_decode(d_llr_vec.data(), d_u_hat_vec.data());
+ extract_info_bits(out, d_u_hat_vec.data());
}
void polar_decoder_sc::sc_decode(float* llrs, unsigned char* u)
diff --git a/gr-fec/lib/polar_decoder_sc_systematic.cc b/gr-fec/lib/polar_decoder_sc_systematic.cc
index 20fbad2d38..cd8f3db586 100644
--- a/gr-fec/lib/polar_decoder_sc_systematic.cc
+++ b/gr-fec/lib/polar_decoder_sc_systematic.cc
@@ -30,34 +30,24 @@ generic_decoder::sptr polar_decoder_sc_systematic::make(
polar_decoder_sc_systematic::polar_decoder_sc_systematic(
int block_size, int num_info_bits, std::vector<int> frozen_bit_positions)
: polar_decoder_common(
- block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>())
+ block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()),
+ d_llr_vec(block_size * (block_power() + 1)),
+ d_u_hat_vec(block_size * (block_power() + 1)),
+ d_frame_vec(block_size)
{
- d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1));
- d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1));
- d_frame_vec = (unsigned char*)volk_malloc(block_size, volk_get_alignment());
- memset(d_frame_vec, 0, sizeof(unsigned char) * block_size);
}
-polar_decoder_sc_systematic::~polar_decoder_sc_systematic()
-{
- volk_free(d_llr_vec);
- volk_free(d_u_hat_vec);
- volk_free(d_frame_vec);
-}
+polar_decoder_sc_systematic::~polar_decoder_sc_systematic() {}
void polar_decoder_sc_systematic::generic_work(void* in_buffer, void* out_buffer)
{
const float* in = (const float*)in_buffer;
unsigned char* out = (unsigned char*)out_buffer;
- initialize_decoder(d_u_hat_vec, d_llr_vec, in);
- sc_decode(d_llr_vec, d_u_hat_vec);
- volk_encode_block(d_frame_vec, d_u_hat_vec);
- extract_info_bits_reversed(out, d_frame_vec);
+ initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in);
+ sc_decode(d_llr_vec.data(), d_u_hat_vec.data());
+ volk_encode_block(d_frame_vec.data(), d_u_hat_vec.data());
+ extract_info_bits_reversed(out, d_frame_vec.data());
}
void polar_decoder_sc_systematic::sc_decode(float* llrs, unsigned char* u)
diff --git a/gr-fec/lib/polar_encoder.cc b/gr-fec/lib/polar_encoder.cc
index 568a0b8e5e..84633ec893 100644
--- a/gr-fec/lib/polar_encoder.cc
+++ b/gr-fec/lib/polar_encoder.cc
@@ -25,6 +25,19 @@ namespace gr {
namespace fec {
namespace code {
+volk::vector<unsigned char> polar_encoder::make_prototype() const
+{
+ volk::vector<unsigned char> proto(block_size() >> 3);
+
+ for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) {
+ int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power());
+ unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i);
+ insert_unpacked_bit_into_packed_array_at_position(
+ proto.data(), frozen_bit, rev_pos);
+ }
+ return proto;
+}
+
generic_encoder::sptr polar_encoder::make(int block_size,
int num_info_bits,
std::vector<int> frozen_bit_positions,
@@ -41,26 +54,12 @@ polar_encoder::polar_encoder(int block_size,
std::vector<uint8_t>& frozen_bit_values,
bool is_packed)
: polar_common(block_size, num_info_bits, frozen_bit_positions, frozen_bit_values),
- d_is_packed(is_packed)
+ d_is_packed(is_packed),
+ d_frozen_bit_prototype(make_prototype())
{
- setup_frozen_bit_inserter();
-}
-
-void polar_encoder::setup_frozen_bit_inserter()
-{
- d_frozen_bit_prototype =
- (unsigned char*)volk_malloc(block_size() >> 3, volk_get_alignment());
- memset(d_frozen_bit_prototype, 0, block_size() >> 3);
-
- for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) {
- int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power());
- unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i);
- insert_unpacked_bit_into_packed_array_at_position(
- d_frozen_bit_prototype, frozen_bit, rev_pos);
- }
}
-polar_encoder::~polar_encoder() { volk_free(d_frozen_bit_prototype); }
+polar_encoder::~polar_encoder() {}
void polar_encoder::generic_work(void* in_buffer, void* out_buffer)
{
@@ -129,7 +128,8 @@ void polar_encoder::encode_vector_packed_interbyte(unsigned char* target) const
void polar_encoder::insert_packed_frozen_bits_and_reverse(
unsigned char* target, const unsigned char* input) const
{
- memcpy(target, d_frozen_bit_prototype, block_size() >> 3);
+ std::copy(
+ std::begin(d_frozen_bit_prototype), std::end(d_frozen_bit_prototype), target);
const int* info_bit_reversed_positions_ptr = &d_info_bit_positions_reversed[0];
int bit_num = 0;
unsigned char byte = *input;
diff --git a/gr-fec/lib/polar_encoder_systematic.cc b/gr-fec/lib/polar_encoder_systematic.cc
index b77f5e0730..ddf898d8b0 100644
--- a/gr-fec/lib/polar_encoder_systematic.cc
+++ b/gr-fec/lib/polar_encoder_systematic.cc
@@ -31,16 +31,12 @@ polar_encoder_systematic::polar_encoder_systematic(int block_size,
int num_info_bits,
std::vector<int> frozen_bit_positions)
: polar_common(
- block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>())
+ block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()),
+ d_volk_syst_intermediate(block_size)
{
- d_volk_syst_intermediate = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * block_size, volk_get_alignment());
}
-polar_encoder_systematic::~polar_encoder_systematic()
-{
- volk_free(d_volk_syst_intermediate);
-}
+polar_encoder_systematic::~polar_encoder_systematic() {}
void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer)
{
@@ -48,8 +44,8 @@ void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer)
unsigned char* out = (unsigned char*)out_buffer;
volk_encode(out, in);
- bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate, out);
- volk_encode_block(out, d_volk_syst_intermediate);
+ bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate.data(), out);
+ volk_encode_block(out, d_volk_syst_intermediate.data());
}
void polar_encoder_systematic::bit_reverse_and_reset_frozen_bits(
diff --git a/gr-fec/lib/scl_list.h b/gr-fec/lib/scl_list.h
index db60b570bc..75eb2fa57f 100644
--- a/gr-fec/lib/scl_list.h
+++ b/gr-fec/lib/scl_list.h
@@ -20,6 +20,9 @@ namespace polar {
struct path {
path();
+ // Disable copy because of raw pointers.
+ path(const path&) = delete;
+ path& operator=(const path&) = delete;
~path();
float path_metric;
bool owns_vectors;
@@ -56,6 +59,11 @@ public:
scl_list(const unsigned int list_size,
const unsigned int block_size,
const unsigned int block_power);
+
+ // Disable copy because of raw pointers.
+ scl_list(const scl_list&) = delete;
+ scl_list& operator=(const scl_list&) = delete;
+
virtual ~scl_list();
const unsigned int size() const { return d_list_size; };
const unsigned int active_size() const { return d_active_path_counter; };
diff --git a/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc b/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc
index 88a5c4a35f..c630623192 100644
--- a/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc
+++ b/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(polar_decoder_sc.h) */
-/* BINDTOOL_HEADER_FILE_HASH(4f87bd7af297a4f14cb8cc3e99af54df) */
+/* BINDTOOL_HEADER_FILE_HASH(e88266330956e15ca422091c6a3c2474) */
/***********************************************************************************/
#include <pybind11/complex.h>
diff --git a/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc b/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc
index 026b456b0e..68047d167a 100644
--- a/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc
+++ b/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(polar_decoder_sc_systematic.h) */
-/* BINDTOOL_HEADER_FILE_HASH(309212b7e2e5619a81028e00aec2914b) */
+/* BINDTOOL_HEADER_FILE_HASH(6c8471f4ff472e9759f2d45d5a357780) */
/***********************************************************************************/
#include <pybind11/complex.h>
diff --git a/gr-fec/python/fec/bindings/polar_encoder_python.cc b/gr-fec/python/fec/bindings/polar_encoder_python.cc
index 74450346ce..38890f74bf 100644
--- a/gr-fec/python/fec/bindings/polar_encoder_python.cc
+++ b/gr-fec/python/fec/bindings/polar_encoder_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(polar_encoder.h) */
-/* BINDTOOL_HEADER_FILE_HASH(58ba51702adfdf1118d059d3f9880beb) */
+/* BINDTOOL_HEADER_FILE_HASH(edc7bd542cbccfc54f3a5195196f1298) */
/***********************************************************************************/
#include <pybind11/complex.h>
diff --git a/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc b/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc
index 1e884df436..4c7ac7f302 100644
--- a/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc
+++ b/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(polar_encoder_systematic.h) */
-/* BINDTOOL_HEADER_FILE_HASH(3030c93396c633b5f7fdba0b4d888e9e) */
+/* BINDTOOL_HEADER_FILE_HASH(7c456083d56b811565b459f2865eae7e) */
/***********************************************************************************/
#include <pybind11/complex.h>