diff --git a/.clang-tidy b/.clang-tidy index 3def598..d4c66b5 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -7,6 +7,7 @@ Checks: '-*, cppcoreguidelines-*, -cppcoreguidelines-macro-usage, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, modernize-*, -modernize-use-trailing-return-type, diff --git a/TODO.md b/TODO.md index 2d53ed8..a98a338 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,8 @@ # meta.hpp - metadata +- add policy tests +- rebind types support * argument defaults * argument names diff --git a/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp b/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp index 22c5cce..53e6f14 100644 --- a/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp +++ b/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp @@ -25,14 +25,14 @@ namespace meta_hpp::detail template < stdex::copy_constructible T > struct index_traits { value operator()(T* v, std::size_t i) const { - return value{*(v + i)}; + return value{v[i]}; } }; template < stdex::copy_constructible T > struct index_traits { value operator()(const T* v, std::size_t i) const { - return value{*(v + i)}; + return value{v[i]}; } }; diff --git a/headers/meta.hpp/meta_states/ctor.hpp b/headers/meta.hpp/meta_states/ctor.hpp index 02fa66e..b4da195 100644 --- a/headers/meta.hpp/meta_states/ctor.hpp +++ b/headers/meta.hpp/meta_states/ctor.hpp @@ -40,22 +40,22 @@ namespace meta_hpp::detail args // NOLINTNEXTLINE(readability-named-parameter) ](std::index_sequence) -> value { - if ( !(... && (args.data() + Is)->can_cast_to>()) ) { + if ( !(... && args[Is].can_cast_to>()) ) { throw_exception_with("an attempt to call a constructor with incorrect argument types"); } if constexpr ( as_object ) { - class_type return_value{(args.data() + Is)->cast>()...}; + class_type return_value{args[Is].cast>()...}; return value{std::move(return_value)}; } if constexpr ( as_raw_ptr ) { - auto return_value{std::make_unique((args.data() + Is)->cast>()...)}; + auto return_value{std::make_unique(args[Is].cast>()...)}; return value{return_value.release()}; } if constexpr ( as_shared_ptr ) { - auto return_value{std::make_shared((args.data() + Is)->cast>()...)}; + auto return_value{std::make_shared(args[Is].cast>()...)}; return value{std::move(return_value)}; } }, std::make_index_sequence()); @@ -72,7 +72,7 @@ namespace meta_hpp::detail // NOLINTNEXTLINE(readability-named-parameter) return std::invoke([args](std::index_sequence){ - return (... && (args.data() + Is)->can_cast_to>()); + return (... && args[Is].can_cast_to>()); }, std::make_index_sequence()); } } diff --git a/headers/meta.hpp/meta_states/function.hpp b/headers/meta.hpp/meta_states/function.hpp index 817ab3f..27d63ac 100644 --- a/headers/meta.hpp/meta_states/function.hpp +++ b/headers/meta.hpp/meta_states/function.hpp @@ -42,19 +42,19 @@ namespace meta_hpp::detail &function, args // NOLINTNEXTLINE(readability-named-parameter) ](std::index_sequence) -> value { - if ( !(... && (args.data() + Is)->can_cast_to>()) ) { + if ( !(... && args[Is].can_cast_to>()) ) { throw_exception_with("an attempt to call a function with incorrect argument types"); } if constexpr ( as_void ) { std::ignore = std::invoke( function, - (args.data() + Is)->cast>()...); + args[Is].cast>()...); return value{}; } else { return_type&& return_value = std::invoke( function, - (args.data() + Is)->cast>()...); + args[Is].cast>()...); if constexpr ( ref_as_ptr ) { return value{std::addressof(return_value)}; @@ -76,7 +76,7 @@ namespace meta_hpp::detail // NOLINTNEXTLINE(readability-named-parameter) return std::invoke([args](std::index_sequence){ - return (... && (args.data() + Is)->can_cast_to>()); + return (... && args[Is].can_cast_to>()); }, std::make_index_sequence()); } } diff --git a/headers/meta.hpp/meta_states/method.hpp b/headers/meta.hpp/meta_states/method.hpp index 69baea2..bed9b9c 100644 --- a/headers/meta.hpp/meta_states/method.hpp +++ b/headers/meta.hpp/meta_states/method.hpp @@ -48,7 +48,7 @@ namespace meta_hpp::detail &method, &inst, args // NOLINTNEXTLINE(readability-named-parameter) ](std::index_sequence) -> value { - if ( !(... && (args.data() + Is)->can_cast_to>()) ) { + if ( !(... && args[Is].can_cast_to>()) ) { throw_exception_with("an attempt to call a method with incorrect argument types"); } @@ -56,13 +56,13 @@ namespace meta_hpp::detail std::ignore = std::invoke( method, inst.cast(), - (args.data() + Is)->cast>()...); + args[Is].cast>()...); return value{}; } else { return_type&& return_value = std::invoke( method, inst.cast(), - (args.data() + Is)->cast>()...); + args[Is].cast>()...); if constexpr ( ref_as_ptr ) { return value{std::addressof(return_value)}; @@ -89,7 +89,7 @@ namespace meta_hpp::detail // NOLINTNEXTLINE(readability-named-parameter) return std::invoke([args](std::index_sequence){ - return (... && (args.data() + Is)->can_cast_to>()); + return (... && args[Is].can_cast_to>()); }, std::make_index_sequence()); } }