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
{
struct argument_opts final {
std::string name{};
metadata_map metadata{};
class argument_info final {
public:
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 {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
struct destructor_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct evalue_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct function_opts final {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
struct member_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct method_opts final {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
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()(std::string name) & {
arguments_.push_back(argument_opts{
.name = std::move(name),
});
arguments_.emplace_back(std::move(name));
return *this;
}
arguments_bind operator()(std::string name) && {
arguments_.push_back(argument_opts{
.name = std::move(name),
});
arguments_.emplace_back(std::move(name));
return std::move(*this);
}
arguments_bind& operator()(std::string name, metadata_map metadata) & {
arguments_.push_back(argument_opts{
.name = std::move(name),
.metadata = std::move(metadata),
});
arguments_.emplace_back(std::move(name), std::move(metadata));
return *this;
}
arguments_bind operator()(std::string name, metadata_map metadata) && {
arguments_.push_back(argument_opts{
.name = std::move(name),
.metadata = std::move(metadata),
});
arguments_.emplace_back(std::move(name), std::move(metadata));
return std::move(*this);
}
operator argument_opts_list() && {
operator argument_info_list() && {
return std::move(arguments_);
}
private:
argument_opts_list arguments_;
argument_info_list 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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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);
}
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") {
{
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") {
{
const meta::uvalue u{42};

View File

@@ -40,42 +40,79 @@ namespace meta_hpp::detail
namespace meta_hpp
{
struct argument_opts final {
std::string name{};
metadata_map metadata{};
class argument_info final {
public:
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 {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
struct destructor_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct evalue_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct function_opts final {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
struct member_opts final {
metadata_map metadata{};
metadata_map metadata;
};
struct method_opts final {
argument_opts_list arguments{};
metadata_map metadata{};
argument_info_list arguments;
metadata_map metadata;
};
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()(std::string name) & {
arguments_.push_back(argument_opts{
.name = std::move(name),
});
arguments_.emplace_back(std::move(name));
return *this;
}
arguments_bind operator()(std::string name) && {
arguments_.push_back(argument_opts{
.name = std::move(name),
});
arguments_.emplace_back(std::move(name));
return std::move(*this);
}
arguments_bind& operator()(std::string name, metadata_map metadata) & {
arguments_.push_back(argument_opts{
.name = std::move(name),
.metadata = std::move(metadata),
});
arguments_.emplace_back(std::move(name), std::move(metadata));
return *this;
}
arguments_bind operator()(std::string name, metadata_map metadata) && {
arguments_.push_back(argument_opts{
.name = std::move(name),
.metadata = std::move(metadata),
});
arguments_.emplace_back(std::move(name), std::move(metadata));
return std::move(*this);
}
operator argument_opts_list() && {
operator argument_info_list() && {
return std::move(arguments_);
}
private:
argument_opts_list arguments_;
argument_info_list 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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
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 ) {
argument& arg = state->arguments[i];
detail::state_access(arg)->name = std::move(opts.arguments[i].name);
detail::state_access(arg)->metadata = std::move(opts.arguments[i].metadata);
detail::state_access(arg)->name = std::move(opts.arguments[i].get_name());
detail::state_access(arg)->metadata = std::move(opts.arguments[i].get_metadata());
}
detail::insert_or_assign(get_state().functions, function{std::move(state)});