try to fix msvc

This commit is contained in:
BlackMATov
2023-08-08 11:15:59 +07:00
parent ca57a44c64
commit 4a295ed2dd
6 changed files with 146 additions and 93 deletions

View File

@@ -4447,42 +4447,79 @@ namespace meta_hpp::detail
namespace meta_hpp namespace meta_hpp
{ {
struct argument_opts final { class argument_info final {
std::string name{}; public:
metadata_map metadata{}; argument_info() = default;
~argument_info() = default;
argument_info(argument_info&& other) = default;
argument_info& operator=(argument_info&&) = default;
argument_info(const argument_info&) = delete;
argument_info& operator=(const argument_info&) = delete;
argument_info(std::string name)
: name_{std::move(name)} {}
argument_info(std::string name, metadata_map metadata)
: name_{std::move(name)}
, metadata_{std::move(metadata)} {}
[[nodiscard]] std::string& get_name() {
return name_;
}
[[nodiscard]] const std::string& get_name() const {
return name_;
}
[[nodiscard]] metadata_map& get_metadata() {
return metadata_;
}
[[nodiscard]] const metadata_map& get_metadata() const {
return metadata_;
}
private:
std::string name_;
metadata_map metadata_;
}; };
using argument_opts_list = std::vector<argument_opts>; using argument_info_list = std::vector<argument_info>;
}
namespace meta_hpp
{
struct constructor_opts final { struct constructor_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct destructor_opts final { struct destructor_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct evalue_opts final { struct evalue_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct function_opts final { struct function_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct member_opts final { struct member_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct method_opts final { struct method_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct variable_opts final { struct variable_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
} }
@@ -4834,41 +4871,31 @@ namespace meta_hpp
arguments_bind& operator=(const arguments_bind&) = delete; arguments_bind& operator=(const arguments_bind&) = delete;
arguments_bind& operator()(std::string name) & { arguments_bind& operator()(std::string name) & {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name));
.name = std::move(name),
});
return *this; return *this;
} }
arguments_bind operator()(std::string name) && { arguments_bind operator()(std::string name) && {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name));
.name = std::move(name),
});
return std::move(*this); return std::move(*this);
} }
arguments_bind& operator()(std::string name, metadata_map metadata) & { arguments_bind& operator()(std::string name, metadata_map metadata) & {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name), std::move(metadata));
.name = std::move(name),
.metadata = std::move(metadata),
});
return *this; return *this;
} }
arguments_bind operator()(std::string name, metadata_map metadata) && { arguments_bind operator()(std::string name, metadata_map metadata) && {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name), std::move(metadata));
.name = std::move(name),
.metadata = std::move(metadata),
});
return std::move(*this); return std::move(*this);
} }
operator argument_opts_list() && { operator argument_info_list() && {
return std::move(arguments_); return std::move(arguments_);
} }
private: private:
argument_opts_list arguments_; argument_info_list arguments_;
}; };
inline arguments_bind arguments_() { inline arguments_bind arguments_() {
@@ -5080,8 +5107,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().constructors, constructor{std::move(state)}); detail::insert_or_assign(get_data().constructors, constructor{std::move(state)});
@@ -5130,8 +5157,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().functions, function{std::move(state)}); detail::insert_or_assign(get_data().functions, function{std::move(state)});
@@ -5202,8 +5229,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().methods, method{std::move(state)}); detail::insert_or_assign(get_data().methods, method{std::move(state)});
@@ -5354,8 +5381,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_state().functions, function{std::move(state)}); detail::insert_or_assign(get_state().functions, function{std::move(state)});

View File

@@ -158,23 +158,6 @@ TEST_CASE("meta/meta_utilities/value2/counters/small") {
CHECK(ivec2::copy_constructor_counter == 0); CHECK(ivec2::copy_constructor_counter == 0);
} }
SUBCASE("copy ctor") {
{
meta::uvalue v1{ivec2{1,2}};
meta::uvalue v2{std::as_const(v1).copy()};
CHECK(v1.as<ivec2>().x == 1);
CHECK(v2.as<ivec2>().y == 2);
CHECK(ivec2::destructor_counter == 1);
CHECK(ivec2::move_constructor_counter == 1);
CHECK(ivec2::copy_constructor_counter == 1);
}
CHECK(ivec2::destructor_counter == 3);
CHECK(ivec2::move_constructor_counter == 1);
CHECK(ivec2::copy_constructor_counter == 1);
}
SUBCASE("swap") { SUBCASE("swap") {
{ {
meta::uvalue v1{ivec2{1,2}}; meta::uvalue v1{ivec2{1,2}};

View File

@@ -476,6 +476,22 @@ TEST_CASE("meta/meta_utilities/value") {
} }
} }
SUBCASE("copy") {
{
const meta::uvalue u{42};
CHECK(u.has_copy_op());
const meta::uvalue v{u.copy()};
CHECK(v.get_type() == meta::resolve_type<int>());
CHECK(v.as<int>() == 42);
}
{
const meta::uvalue u{std::unique_ptr<int>{}};
CHECK_FALSE(u.has_copy_op());
CHECK_FALSE(u.copy());
}
}
SUBCASE("unmap") { SUBCASE("unmap") {
{ {
const meta::uvalue u{42}; const meta::uvalue u{42};

View File

@@ -40,42 +40,79 @@ namespace meta_hpp::detail
namespace meta_hpp namespace meta_hpp
{ {
struct argument_opts final { class argument_info final {
std::string name{}; public:
metadata_map metadata{}; argument_info() = default;
~argument_info() = default;
argument_info(argument_info&& other) = default;
argument_info& operator=(argument_info&&) = default;
argument_info(const argument_info&) = delete;
argument_info& operator=(const argument_info&) = delete;
argument_info(std::string name)
: name_{std::move(name)} {}
argument_info(std::string name, metadata_map metadata)
: name_{std::move(name)}
, metadata_{std::move(metadata)} {}
[[nodiscard]] std::string& get_name() {
return name_;
}
[[nodiscard]] const std::string& get_name() const {
return name_;
}
[[nodiscard]] metadata_map& get_metadata() {
return metadata_;
}
[[nodiscard]] const metadata_map& get_metadata() const {
return metadata_;
}
private:
std::string name_;
metadata_map metadata_;
}; };
using argument_opts_list = std::vector<argument_opts>; using argument_info_list = std::vector<argument_info>;
}
namespace meta_hpp
{
struct constructor_opts final { struct constructor_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct destructor_opts final { struct destructor_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct evalue_opts final { struct evalue_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct function_opts final { struct function_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct member_opts final { struct member_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
struct method_opts final { struct method_opts final {
argument_opts_list arguments{}; argument_info_list arguments;
metadata_map metadata{}; metadata_map metadata;
}; };
struct variable_opts final { struct variable_opts final {
metadata_map metadata{}; metadata_map metadata;
}; };
} }
@@ -427,41 +464,31 @@ namespace meta_hpp
arguments_bind& operator=(const arguments_bind&) = delete; arguments_bind& operator=(const arguments_bind&) = delete;
arguments_bind& operator()(std::string name) & { arguments_bind& operator()(std::string name) & {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name));
.name = std::move(name),
});
return *this; return *this;
} }
arguments_bind operator()(std::string name) && { arguments_bind operator()(std::string name) && {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name));
.name = std::move(name),
});
return std::move(*this); return std::move(*this);
} }
arguments_bind& operator()(std::string name, metadata_map metadata) & { arguments_bind& operator()(std::string name, metadata_map metadata) & {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name), std::move(metadata));
.name = std::move(name),
.metadata = std::move(metadata),
});
return *this; return *this;
} }
arguments_bind operator()(std::string name, metadata_map metadata) && { arguments_bind operator()(std::string name, metadata_map metadata) && {
arguments_.push_back(argument_opts{ arguments_.emplace_back(std::move(name), std::move(metadata));
.name = std::move(name),
.metadata = std::move(metadata),
});
return std::move(*this); return std::move(*this);
} }
operator argument_opts_list() && { operator argument_info_list() && {
return std::move(arguments_); return std::move(arguments_);
} }
private: private:
argument_opts_list arguments_; argument_info_list arguments_;
}; };
inline arguments_bind arguments_() { inline arguments_bind arguments_() {

View File

@@ -171,8 +171,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().constructors, constructor{std::move(state)}); detail::insert_or_assign(get_data().constructors, constructor{std::move(state)});
@@ -221,8 +221,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().functions, function{std::move(state)}); detail::insert_or_assign(get_data().functions, function{std::move(state)});
@@ -293,8 +293,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_data().methods, method{std::move(state)}); detail::insert_or_assign(get_data().methods, method{std::move(state)});

View File

@@ -35,8 +35,8 @@ namespace meta_hpp
for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) { for ( std::size_t i{}, e{std::min(opts.arguments.size(), state->arguments.size())}; i < e; ++i ) {
argument& arg = state->arguments[i]; argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name); detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata); detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
} }
detail::insert_or_assign(get_state().functions, function{std::move(state)}); detail::insert_or_assign(get_state().functions, function{std::move(state)});