From 457defadaa6c0ddefaba39f756deaab481d0d4f1 Mon Sep 17 00:00:00 2001 From: red0124 <75804778+red0124@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:22:10 +0100 Subject: [PATCH] Bugfix/odr violations (#47) * Make common non-member functions inline, remove unreachable line from get_line_buffer * [skip ci] Fix namespace comments --- .gitignore | 2 ++ include/ss/common.hpp | 16 ++++++--------- include/ss/converter.hpp | 2 +- include/ss/exception.hpp | 2 +- include/ss/extract.hpp | 4 ++-- include/ss/function_traits.hpp | 2 +- include/ss/parser.hpp | 2 +- include/ss/restrictions.hpp | 2 +- include/ss/setup.hpp | 2 +- include/ss/splitter.hpp | 3 +-- include/ss/type_traits.hpp | 2 +- ssp.hpp | 37 +++++++++++++++------------------- test/test_extractions.cpp | 2 +- test/test_helpers.hpp | 4 ++-- test/test_parser1.hpp | 2 +- test/test_parser2.hpp | 2 +- test/test_splitter.cpp | 4 ++-- 17 files changed, 41 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index eb880af..1fadaf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ compile_commands.json .clang-format +.clang-tidy .ccls-cache/* +.cache/ experiment/ build/ hbuild/ diff --git a/include/ss/common.hpp b/include/ss/common.hpp index c70230e..6a7ee62 100644 --- a/include/ss/common.hpp +++ b/include/ss/common.hpp @@ -45,7 +45,7 @@ inline ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { using ssize_t = intptr_t; -ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { +inline ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { char buff[get_line_initial_buffer_size]; if (lineptr == nullptr || n < sizeof(buff)) { @@ -81,7 +81,7 @@ ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { #endif -ssize_t get_line_buffer(char*& lineptr, size_t& n, +inline ssize_t get_line_buffer(char*& lineptr, size_t& n, const char* const csv_data_buffer, size_t csv_data_size, size_t& curr_char) { if (curr_char >= csv_data_size) { @@ -114,15 +114,11 @@ ssize_t get_line_buffer(char*& lineptr, size_t& n, } } - if (line_used != 0) { - lineptr[line_used] = '\0'; - return line_used; - } - - return -1; + lineptr[line_used] = '\0'; + return line_used; } -std::tuple get_line(char*& buffer, size_t& buffer_size, +inline std::tuple get_line(char*& buffer, size_t& buffer_size, FILE* file, const char* const csv_data_buffer, size_t csv_data_size, size_t& curr_char) { @@ -145,4 +141,4 @@ std::tuple get_line(char*& buffer, size_t& buffer_size, return {ssize, false}; } -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/converter.hpp b/include/ss/converter.hpp index 5058df5..0a1a1f8 100644 --- a/include/ss/converter.hpp +++ b/include/ss/converter.hpp @@ -493,4 +493,4 @@ private: size_t number_of_columns_; }; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/exception.hpp b/include/ss/exception.hpp index 97c714a..3733d19 100644 --- a/include/ss/exception.hpp +++ b/include/ss/exception.hpp @@ -20,4 +20,4 @@ public: } }; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/extract.hpp b/include/ss/extract.hpp index 64b6b1b..99fa2e7 100644 --- a/include/ss/extract.hpp +++ b/include/ss/extract.hpp @@ -142,7 +142,7 @@ template struct unsupported_type { constexpr static bool value = false; }; -} /* namespace */ +} /* namespace errors */ template std::enable_if_t && !std::is_floating_point_v && @@ -247,4 +247,4 @@ inline bool extract(const char* begin, const char* end, return true; } -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/function_traits.hpp b/include/ss/function_traits.hpp index c22a936..945a97e 100644 --- a/include/ss/function_traits.hpp +++ b/include/ss/function_traits.hpp @@ -77,4 +77,4 @@ struct member_wrapper { template \ constexpr bool has_m_##method##_t = has_m_##method::value; -} /* trait */ +} /* namespace ss */ diff --git a/include/ss/parser.hpp b/include/ss/parser.hpp index e800593..86b3a7b 100644 --- a/include/ss/parser.hpp +++ b/include/ss/parser.hpp @@ -971,4 +971,4 @@ private: bool eof_{false}; }; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/restrictions.hpp b/include/ss/restrictions.hpp index e72611e..e21a473 100644 --- a/include/ss/restrictions.hpp +++ b/include/ss/restrictions.hpp @@ -124,4 +124,4 @@ struct ne { } }; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/setup.hpp b/include/ss/setup.hpp index 2f298fc..d2a5d2f 100644 --- a/include/ss/setup.hpp +++ b/include/ss/setup.hpp @@ -293,4 +293,4 @@ private: template struct setup> : setup {}; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/splitter.hpp b/include/ss/splitter.hpp index d974e83..ea00c87 100644 --- a/include/ss/splitter.hpp +++ b/include/ss/splitter.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -479,4 +478,4 @@ public: friend class converter; }; -} /* ss */ +} /* namespace ss */ diff --git a/include/ss/type_traits.hpp b/include/ss/type_traits.hpp index 294b8bb..1a1d2ee 100644 --- a/include/ss/type_traits.hpp +++ b/include/ss/type_traits.hpp @@ -378,4 +378,4 @@ T to_object(U&& data) { } } -} /* trait */ +} /* namespace ss */ diff --git a/ssp.hpp b/ssp.hpp index 811a490..41042aa 100644 --- a/ssp.hpp +++ b/ssp.hpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -394,7 +393,7 @@ T to_object(U&& data) { } } -} /* trait */ +} /* namespace ss */ namespace ss { @@ -414,7 +413,7 @@ public: } }; -} /* ss */ +} /* namespace ss */ namespace ss { @@ -490,7 +489,7 @@ struct member_wrapper { template \ constexpr bool has_m_##method##_t = has_m_##method::value; -} /* trait */ +} /* namespace ss */ namespace ss { @@ -616,7 +615,7 @@ struct ne { } }; -} /* ss */ +} /* namespace ss */ namespace ss { @@ -657,7 +656,7 @@ inline ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { using ssize_t = intptr_t; -ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { +inline ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { char buff[get_line_initial_buffer_size]; if (lineptr == nullptr || n < sizeof(buff)) { @@ -693,7 +692,7 @@ ssize_t get_line_file(char*& lineptr, size_t& n, FILE* file) { #endif -ssize_t get_line_buffer(char*& lineptr, size_t& n, +inline ssize_t get_line_buffer(char*& lineptr, size_t& n, const char* const csv_data_buffer, size_t csv_data_size, size_t& curr_char) { if (curr_char >= csv_data_size) { @@ -726,15 +725,11 @@ ssize_t get_line_buffer(char*& lineptr, size_t& n, } } - if (line_used != 0) { - lineptr[line_used] = '\0'; - return line_used; - } - - return -1; + lineptr[line_used] = '\0'; + return line_used; } -std::tuple get_line(char*& buffer, size_t& buffer_size, +inline std::tuple get_line(char*& buffer, size_t& buffer_size, FILE* file, const char* const csv_data_buffer, size_t csv_data_size, size_t& curr_char) { @@ -757,7 +752,7 @@ std::tuple get_line(char*& buffer, size_t& buffer_size, return {ssize, false}; } -} /* ss */ +} /* namespace ss */ namespace ss { @@ -1050,7 +1045,7 @@ private: template struct setup> : setup {}; -} /* ss */ +} /* namespace ss */ namespace ss { @@ -1521,7 +1516,7 @@ public: friend class converter; }; -} /* ss */ +} /* namespace ss */ #ifndef SSP_DISABLE_FAST_FLOAT @@ -1654,7 +1649,7 @@ template struct unsupported_type { constexpr static bool value = false; }; -} /* namespace */ +} /* namespace error */ template std::enable_if_t && !std::is_floating_point_v && @@ -1759,7 +1754,7 @@ inline bool extract(const char* begin, const char* end, return true; } -} /* ss */ +} /* namespace ss */ namespace ss { INIT_HAS_METHOD(tied) @@ -2245,7 +2240,7 @@ private: size_t number_of_columns_; }; -} /* ss */ +} /* namespace ss */ namespace ss { @@ -3207,4 +3202,4 @@ private: bool eof_{false}; }; -} /* ss */ +} /* namespace ss */ diff --git a/test/test_extractions.cpp b/test/test_extractions.cpp index 88ec317..6e44196 100644 --- a/test/test_extractions.cpp +++ b/test/test_extractions.cpp @@ -23,7 +23,7 @@ struct is_unsigned : public std::is_unsigned {}; template <> struct is_unsigned : public std::true_type {}; -} /* namespace */ +} /* anonymous namespace */ static_assert(is_signed::value); static_assert(is_unsigned::value); diff --git a/test/test_helpers.hpp b/test/test_helpers.hpp index 188e731..80761c6 100644 --- a/test/test_helpers.hpp +++ b/test/test_helpers.hpp @@ -19,7 +19,7 @@ namespace ss { template class parser; -} /* ss */ +} /* namespace ss */ namespace { @@ -224,4 +224,4 @@ make_parser(const std::string& file_name, return make_parser_impl(file_name, delim); } -} /* namespace */ +} /* anonymous namespace */ diff --git a/test/test_parser1.hpp b/test/test_parser1.hpp index 90267c8..98d69ce 100644 --- a/test/test_parser1.hpp +++ b/test/test_parser1.hpp @@ -109,4 +109,4 @@ static void make_and_write(const std::string& file_name, } } -} /* namespace */ +} /* anonymous namespace */ diff --git a/test/test_parser2.hpp b/test/test_parser2.hpp index 6048a33..7affddf 100644 --- a/test/test_parser2.hpp +++ b/test/test_parser2.hpp @@ -616,7 +616,7 @@ void test_option_combinations3() { test_option_combinations2(); } -} /* namespace */ +} /* anonymous namespace */ // Tests split into multiple compilation units #if 0 diff --git a/test/test_splitter.cpp b/test/test_splitter.cpp index 201de9d..5216688 100644 --- a/test/test_splitter.cpp +++ b/test/test_splitter.cpp @@ -145,7 +145,7 @@ make_combinations(const std::vector& input, return {std::move(lines), std::move(expectations)}; } -} /* namespace */ +} /* anonymous namespace */ /* ********************************** */ /* ********************************** */ @@ -548,7 +548,7 @@ public: return splitter.size_shifted(); } }; -} /* ss */ +} /* namespace ss */ TEST_CASE("splitter test resplit unterminated quote") {