From 23761bade5e02e9ce30148a520d3c42bd8c380ff Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 13 May 2019 10:29:19 +0200 Subject: [PATCH 1/4] Dont inline generic pack/unpack to enable externalized serialization --- include/fc/io/raw.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/fc/io/raw.hpp b/include/fc/io/raw.hpp index 4e81b30..4247a7c 100755 --- a/include/fc/io/raw.hpp +++ b/include/fc/io/raw.hpp @@ -524,11 +524,11 @@ namespace fc { template - inline void pack( Stream& s, const T& v ) { + void pack( Stream& s, const T& v ) { fc::raw::detail::if_reflected< typename fc::reflector::is_defined >::pack(s,v); } template - inline void unpack( Stream& s, T& v ) + void unpack( Stream& s, T& v ) { try { fc::raw::detail::if_reflected< typename fc::reflector::is_defined >::unpack(s,v); } FC_RETHROW_EXCEPTIONS( warn, "error unpacking ${type}", ("type",fc::get_typename::name() ) ) } From a94d110b5d4f526caf1f2a49aae7c5057b62dde2 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 15 May 2019 12:48:06 +0200 Subject: [PATCH 2/4] Get rid of some inlines --- include/fc/io/raw.hpp | 1 - include/fc/network/ip.hpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/fc/io/raw.hpp b/include/fc/io/raw.hpp index 4247a7c..7e5b5f1 100755 --- a/include/fc/io/raw.hpp +++ b/include/fc/io/raw.hpp @@ -522,7 +522,6 @@ namespace fc { } - template void pack( Stream& s, const T& v ) { fc::raw::detail::if_reflected< typename fc::reflector::is_defined >::pack(s,v); diff --git a/include/fc/network/ip.hpp b/include/fc/network/ip.hpp index 5a1bd0c..1f23c5e 100755 --- a/include/fc/network/ip.hpp +++ b/include/fc/network/ip.hpp @@ -83,12 +83,12 @@ namespace fc { namespace raw { template - inline void pack( Stream& s, const ip::address& v ) + void pack( Stream& s, const ip::address& v ) { fc::raw::pack( s, uint32_t(v) ); } template - inline void unpack( Stream& s, ip::address& v ) + void unpack( Stream& s, ip::address& v ) { uint32_t _ip; fc::raw::unpack( s, _ip ); From 1893cb336c03c2f150f7bba0fb1c7cf607c50dc0 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 20 May 2019 21:38:15 +0200 Subject: [PATCH 3/4] Separate exception declaration and implementation --- include/fc/exception/exception.hpp | 117 +++++++++++++++++------------ src/exception.cpp | 19 +++++ 2 files changed, 86 insertions(+), 50 deletions(-) diff --git a/include/fc/exception/exception.hpp b/include/fc/exception/exception.hpp index 6fb66fa..24bd0f9 100755 --- a/include/fc/exception/exception.hpp +++ b/include/fc/exception/exception.hpp @@ -5,6 +5,7 @@ */ #include #include +#include #include #include #include @@ -222,81 +223,97 @@ namespace fc }(); \ -#define FC_DECLARE_DERIVED_EXCEPTION( TYPE, BASE, CODE, WHAT ) \ +#define FC_DECLARE_DERIVED_EXCEPTION( TYPE, BASE, CODE ) \ class TYPE : public BASE \ { \ public: \ enum code_enum { \ code_value = CODE, \ }; \ - explicit TYPE( int64_t code, const std::string& name_value, const std::string& what_value ) \ - :BASE( code, name_value, what_value ){} \ - explicit TYPE( fc::log_message&& m, int64_t code, const std::string& name_value, const std::string& what_value ) \ - :BASE( std::move(m), code, name_value, what_value ){} \ - explicit TYPE( fc::log_messages&& m, int64_t code, const std::string& name_value, const std::string& what_value )\ - :BASE( std::move(m), code, name_value, what_value ){}\ - explicit TYPE( const fc::log_messages& m, int64_t code, const std::string& name_value, const std::string& what_value )\ - :BASE( m, code, name_value, what_value ){}\ - TYPE( const std::string& what_value, const fc::log_messages& m ) \ - :BASE( m, CODE, BOOST_PP_STRINGIZE(TYPE), what_value ){} \ - TYPE( fc::log_message&& m ) \ - :BASE( fc::move(m), CODE, BOOST_PP_STRINGIZE(TYPE), WHAT ){}\ - TYPE( fc::log_messages msgs ) \ - :BASE( fc::move( msgs ), CODE, BOOST_PP_STRINGIZE(TYPE), WHAT ) {} \ - TYPE( const TYPE& c ) \ - :BASE(c){} \ - TYPE( const BASE& c ) \ - :BASE(c){} \ - TYPE():BASE(CODE, BOOST_PP_STRINGIZE(TYPE), WHAT){}\ + explicit TYPE( int64_t code, const std::string& name_value, const std::string& what_value ); \ + explicit TYPE( fc::log_message&& m, int64_t code, const std::string& name_value, const std::string& what_value ); \ + explicit TYPE( fc::log_messages&& m, int64_t code, const std::string& name_value, const std::string& what_value );\ + explicit TYPE( const fc::log_messages& m, int64_t code, const std::string& name_value, const std::string& what_value );\ + explicit TYPE( const std::string& what_value, const fc::log_messages& m ); \ + explicit TYPE( fc::log_message&& m ); \ + explicit TYPE( fc::log_messages msgs ); \ + TYPE( TYPE&& c ) = default; \ + TYPE( const TYPE& c ); \ + TYPE( const BASE& c ); \ + explicit TYPE();\ \ - virtual std::shared_ptr dynamic_copy_exception()const\ - { return std::make_shared( *this ); } \ - virtual NO_RETURN void dynamic_rethrow_exception()const \ - { if( code() == CODE ) throw *this;\ - else fc::exception::dynamic_rethrow_exception(); \ - } \ + virtual std::shared_ptr dynamic_copy_exception()const;\ + virtual NO_RETURN void dynamic_rethrow_exception()const; \ }; - #define FC_DECLARE_EXCEPTION( TYPE, CODE, WHAT ) \ - FC_DECLARE_DERIVED_EXCEPTION( TYPE, fc::exception, CODE, WHAT ) +#define FC_IMPLEMENT_DERIVED_EXCEPTION( TYPE, BASE, CODE, WHAT ) \ + TYPE::TYPE( int64_t code, const std::string& name_value, const std::string& what_value ) \ + : BASE( code, name_value, what_value ) {} \ + TYPE::TYPE( fc::log_message&& m, int64_t code, const std::string& name_value, const std::string& what_value ) \ + : BASE( std::move(m), code, name_value, what_value ) {} \ + TYPE::TYPE( fc::log_messages&& m, int64_t code, const std::string& name_value, const std::string& what_value ) \ + : BASE( std::move(m), code, name_value, what_value ) {} \ + TYPE::TYPE( const fc::log_messages& m, int64_t code, const std::string& name_value, const std::string& what_value ) \ + : BASE( m, code, name_value, what_value ) {} \ + TYPE::TYPE( const std::string& what_value, const fc::log_messages& m ) \ + : BASE( m, CODE, BOOST_PP_STRINGIZE(TYPE), what_value ) {} \ + TYPE::TYPE( fc::log_message&& m ) \ + : BASE( std::move(m), CODE, BOOST_PP_STRINGIZE(TYPE), WHAT ) {} \ + TYPE::TYPE( fc::log_messages msgs ) \ + : BASE( std::move( msgs ), CODE, BOOST_PP_STRINGIZE(TYPE), WHAT ) {} \ + TYPE::TYPE( const TYPE& c ) : BASE(c) {} \ + TYPE::TYPE( const BASE& c ) : BASE(c) {} \ + TYPE::TYPE() : BASE(CODE, BOOST_PP_STRINGIZE(TYPE), WHAT) {} \ + \ + std::shared_ptr TYPE::dynamic_copy_exception()const \ + { \ + return std::make_shared( *this ); \ + } \ + NO_RETURN void TYPE::dynamic_rethrow_exception()const \ + { \ + if( code() == CODE ) throw *this;\ + else fc::exception::dynamic_rethrow_exception(); \ + } - FC_DECLARE_EXCEPTION( timeout_exception, timeout_exception_code, "Timeout" ); - FC_DECLARE_EXCEPTION( file_not_found_exception, file_not_found_exception_code, "File Not Found" ); +#define FC_DECLARE_EXCEPTION( TYPE, CODE ) \ + FC_DECLARE_DERIVED_EXCEPTION( TYPE, fc::exception, CODE ) + +#define FC_IMPLEMENT_EXCEPTION( TYPE, CODE, WHAT ) \ + FC_IMPLEMENT_DERIVED_EXCEPTION( TYPE, fc::exception, CODE, WHAT ) + + FC_DECLARE_EXCEPTION( timeout_exception, timeout_exception_code ); + FC_DECLARE_EXCEPTION( file_not_found_exception, file_not_found_exception_code ); /** - * @brief report's parse errors + * @brief reports parse errors */ - FC_DECLARE_EXCEPTION( parse_error_exception, parse_error_exception_code, "Parse Error" ); - FC_DECLARE_EXCEPTION( invalid_arg_exception, invalid_arg_exception_code, "Invalid Argument" ); + FC_DECLARE_EXCEPTION( parse_error_exception, parse_error_exception_code ); + FC_DECLARE_EXCEPTION( invalid_arg_exception, invalid_arg_exception_code ); /** * @brief reports when a key, guid, or other item is not found. */ - FC_DECLARE_EXCEPTION( key_not_found_exception, key_not_found_exception_code, "Key Not Found" ); - FC_DECLARE_EXCEPTION( bad_cast_exception, bad_cast_exception_code, "Bad Cast" ); - FC_DECLARE_EXCEPTION( out_of_range_exception, out_of_range_exception_code, "Out of Range" ); + FC_DECLARE_EXCEPTION( key_not_found_exception, key_not_found_exception_code ); + FC_DECLARE_EXCEPTION( bad_cast_exception, bad_cast_exception_code ); + FC_DECLARE_EXCEPTION( out_of_range_exception, out_of_range_exception_code ); /** @brief if an operation is unsupported or not valid this may be thrown */ - FC_DECLARE_EXCEPTION( invalid_operation_exception, - invalid_operation_exception_code, - "Invalid Operation" ); + FC_DECLARE_EXCEPTION( invalid_operation_exception, invalid_operation_exception_code ); /** @brief if an host name can not be resolved this may be thrown */ - FC_DECLARE_EXCEPTION( unknown_host_exception, - unknown_host_exception_code, - "Unknown Host" ); + FC_DECLARE_EXCEPTION( unknown_host_exception, unknown_host_exception_code ); /** * @brief used to report a canceled Operation */ - FC_DECLARE_EXCEPTION( canceled_exception, canceled_exception_code, "Canceled" ); + FC_DECLARE_EXCEPTION( canceled_exception, canceled_exception_code ); /** * @brief used inplace of assert() to report violations of pre conditions. */ - FC_DECLARE_EXCEPTION( assert_exception, assert_exception_code, "Assert Exception" ); - FC_DECLARE_EXCEPTION( eof_exception, eof_exception_code, "End Of File" ); - FC_DECLARE_EXCEPTION( null_optional, null_optional_code, "null optional" ); - FC_DECLARE_EXCEPTION( aes_exception, aes_error_code, "AES error" ); - FC_DECLARE_EXCEPTION( overflow_exception, overflow_code, "Integer Overflow" ); - FC_DECLARE_EXCEPTION( underflow_exception, underflow_code, "Integer Underflow" ); - FC_DECLARE_EXCEPTION( divide_by_zero_exception, divide_by_zero_code, "Integer Divide By Zero" ); + FC_DECLARE_EXCEPTION( assert_exception, assert_exception_code ); + FC_DECLARE_EXCEPTION( eof_exception, eof_exception_code ); + FC_DECLARE_EXCEPTION( null_optional, null_optional_code ); + FC_DECLARE_EXCEPTION( aes_exception, aes_error_code ); + FC_DECLARE_EXCEPTION( overflow_exception, overflow_code ); + FC_DECLARE_EXCEPTION( underflow_exception, underflow_code ); + FC_DECLARE_EXCEPTION( divide_by_zero_exception, divide_by_zero_code ); std::string except_str(); diff --git a/src/exception.cpp b/src/exception.cpp index 0e0b956..0693f1a 100755 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -8,6 +8,25 @@ namespace fc { + FC_IMPLEMENT_EXCEPTION( timeout_exception, timeout_exception_code, "Timeout" ) + FC_IMPLEMENT_EXCEPTION( file_not_found_exception, file_not_found_exception_code, "File Not Found" ) + FC_IMPLEMENT_EXCEPTION( parse_error_exception, parse_error_exception_code, "Parse Error" ) + FC_IMPLEMENT_EXCEPTION( invalid_arg_exception, invalid_arg_exception_code, "Invalid Argument" ) + FC_IMPLEMENT_EXCEPTION( key_not_found_exception, key_not_found_exception_code, "Key Not Found" ) + FC_IMPLEMENT_EXCEPTION( bad_cast_exception, bad_cast_exception_code, "Bad Cast" ) + FC_IMPLEMENT_EXCEPTION( out_of_range_exception, out_of_range_exception_code, "Out of Range" ) + FC_IMPLEMENT_EXCEPTION( method_not_found_exception, method_not_found_exception_code, "Method Not Found" ); + FC_IMPLEMENT_EXCEPTION( invalid_operation_exception, invalid_operation_exception_code, "Invalid Operation" ) + FC_IMPLEMENT_EXCEPTION( unknown_host_exception, unknown_host_exception_code, "Unknown Host" ) + FC_IMPLEMENT_EXCEPTION( canceled_exception, canceled_exception_code, "Canceled" ) + FC_IMPLEMENT_EXCEPTION( assert_exception, assert_exception_code, "Assert Exception" ) + FC_IMPLEMENT_EXCEPTION( eof_exception, eof_exception_code, "End Of File" ) + FC_IMPLEMENT_EXCEPTION( null_optional, null_optional_code, "null optional" ) + FC_IMPLEMENT_EXCEPTION( aes_exception, aes_error_code, "AES error" ) + FC_IMPLEMENT_EXCEPTION( overflow_exception, overflow_code, "Integer Overflow" ) + FC_IMPLEMENT_EXCEPTION( underflow_exception, underflow_code, "Integer Underflow" ) + FC_IMPLEMENT_EXCEPTION( divide_by_zero_exception, divide_by_zero_code, "Integer Divide By Zero" ) + FC_REGISTER_EXCEPTIONS( (timeout_exception) (file_not_found_exception) (parse_error_exception) From 2343ab74f35e7188df0c63ad502b0ee9e7574310 Mon Sep 17 00:00:00 2001 From: gladcow Date: Thu, 19 Sep 2019 18:21:50 +0300 Subject: [PATCH 4/4] fix compilation errors --- include/fc/network/ip.hpp | 2 +- src/exception.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/fc/network/ip.hpp b/include/fc/network/ip.hpp index 1f23c5e..8c5f548 100755 --- a/include/fc/network/ip.hpp +++ b/include/fc/network/ip.hpp @@ -113,7 +113,7 @@ namespace fc { } } // namespace fc -FC_REFLECT_TYPENAME( fc::ip::address ) +FC_REFLECT_EMPTY( fc::ip::address ) FC_REFLECT_TYPENAME( fc::ip::endpoint ) namespace std { diff --git a/src/exception.cpp b/src/exception.cpp index 0693f1a..a7fc4fe 100755 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -15,7 +15,6 @@ namespace fc FC_IMPLEMENT_EXCEPTION( key_not_found_exception, key_not_found_exception_code, "Key Not Found" ) FC_IMPLEMENT_EXCEPTION( bad_cast_exception, bad_cast_exception_code, "Bad Cast" ) FC_IMPLEMENT_EXCEPTION( out_of_range_exception, out_of_range_exception_code, "Out of Range" ) - FC_IMPLEMENT_EXCEPTION( method_not_found_exception, method_not_found_exception_code, "Method Not Found" ); FC_IMPLEMENT_EXCEPTION( invalid_operation_exception, invalid_operation_exception_code, "Invalid Operation" ) FC_IMPLEMENT_EXCEPTION( unknown_host_exception, unknown_host_exception_code, "Unknown Host" ) FC_IMPLEMENT_EXCEPTION( canceled_exception, canceled_exception_code, "Canceled" )