refactor: change DEF_EX macro's underlying implementation to template

This commit is contained in:
shenleban tongying 2024-11-11 23:10:53 -05:00
parent 608016208b
commit 4758f9e972
2 changed files with 44 additions and 28 deletions

View file

@ -17,7 +17,6 @@ Checks: >
portability-*, portability-*,
readability-*, readability-*,
-bugprone-easily-swappable-parameters, -bugprone-easily-swappable-parameters,
-bugprone-reserved-identifier,
-cppcoreguidelines-owning-memory, -cppcoreguidelines-owning-memory,
-cppcoreguidelines-prefer-member-initializer, -cppcoreguidelines-prefer-member-initializer,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay, -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
@ -44,5 +43,11 @@ CheckOptions:
value: 1 value: 1
- key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors - key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors
value: 1 value: 1
- key: modernize-avoid-c-arrays.AllowStringArrays
value: 1
- key: cppcoreguidelines-avoid-c-arrays.AllowStringArrays
value: 1
- key: hicpp-avoid-c-arrays.AllowStringArrays
value: 1
... ...

View file

@ -4,22 +4,17 @@
#pragma once #pragma once
#include <string> #include <string>
#include <fmt/format.h>
// clang-format off
/// A way to declare an exception class fast /// A way to declare an exception class fast
/// Do like this: /// Do like this:
/// DEF_EX( exErrorInFoo, "An error in foo encountered", std::exception ) /// DEF_EX( exErrorInFoo, "An error in foo encountered", std::exception )
/// DEF_EX( exFooNotFound, "Foo was not found", exErrorInFoo ) /// DEF_EX( exFooNotFound, "Foo was not found", exErrorInFoo )
#define DEF_EX( exName, exDescription, exParent ) \ #define DEF_EX( exName, exDescription, exParent ) \
class exName: public exParent \ constexpr static char ExStr_## exName[] = exDescription; \
{ \ using exName = defineEx< exParent, ExStr_## exName >;
public: \
virtual const char * what() const noexcept \
{ \
return ( exDescription ); \
} \
virtual ~exName() noexcept {} \
};
/// Same as DEF_EX, but takes a runtime string argument, which gets concatenated /// Same as DEF_EX, but takes a runtime string argument, which gets concatenated
/// with the description. /// with the description.
@ -29,20 +24,36 @@
/// throw exCantOpen( "example.txt" ); /// throw exCantOpen( "example.txt" );
/// ///
/// what() would return "can't open file example.txt" /// what() would return "can't open file example.txt"
///
#define DEF_EX_STR( exName, exDescription, exParent ) \ #define DEF_EX_STR( exName, exDescription, exParent ) \
class exName: public exParent \ constexpr static char ExStr_## exName[] = exDescription; \
{ \ using exName = defineExStr< exParent, ExStr_## exName >;
std::string value; \
\ // clang-format on
public: \
explicit exName( std::string const & value_ ): \ template< typename ParentEx, const char * description >
value( std::string( exDescription ) + " " + value_ ) \ class defineEx: public ParentEx
{ \ {
} \ public:
virtual const char * what() const noexcept \ virtual const char * what() const noexcept
{ \ {
return value.c_str(); \ return description;
} \ }
virtual ~exName() noexcept {} \ };
template< typename ParentEx, const char * description >
class defineExStr: public ParentEx
{
public:
explicit defineExStr( std::string const & message_ ):
message( fmt::format( "{} {}", description, message_ ) )
{
}
virtual const char * what() const noexcept
{
return message.c_str();
}
private:
std::string message;
}; };