parameter_index without name

This commit is contained in:
BlackMATov
2022-02-08 07:16:16 +07:00
parent 5a20a1c7b2
commit 9afb3920fc
4 changed files with 22 additions and 16 deletions

View File

@@ -119,18 +119,18 @@ namespace meta_hpp
public:
parameter_index() = delete;
[[nodiscard]] const any_type& get_type() const noexcept;
[[nodiscard]] const std::string& get_name() const noexcept;
[[nodiscard]] std::size_t get_position() const noexcept;
private:
friend detail::parameter_state;
template < typename Parameter >
[[nodiscard]] static parameter_index make(std::string name);
[[nodiscard]] static parameter_index make(std::size_t position);
private:
explicit parameter_index(any_type type, std::string name);
explicit parameter_index(any_type type, std::size_t position);
friend bool operator<(const parameter_index& l, const parameter_index& r) noexcept;
friend bool operator==(const parameter_index& l, const parameter_index& r) noexcept;
private:
any_type type_;
std::string name_;
std::size_t position_{};
};
class scope_index final {

View File

@@ -14,28 +14,28 @@
namespace meta_hpp
{
inline parameter_index::parameter_index(any_type type, std::string name)
inline parameter_index::parameter_index(any_type type, std::size_t position)
: type_{std::move(type)}
, name_{std::move(name)} {}
, position_{position} {}
template < typename Parameter >
inline parameter_index parameter_index::make(std::string name) {
return parameter_index{detail::resolve_type<Parameter>(), std::move(name)};
inline parameter_index parameter_index::make(std::size_t position) {
return parameter_index{detail::resolve_type<Parameter>(), position};
}
inline const any_type& parameter_index::get_type() const noexcept {
return type_;
}
inline const std::string& parameter_index::get_name() const noexcept {
return name_;
inline std::size_t parameter_index::get_position() const noexcept {
return position_;
}
inline bool operator<(const parameter_index& l, const parameter_index& r) noexcept {
return l.type_ < r.type_ || (l.type_ == r.type_ && std::less<>{}(l.name_, r.name_));
return l.type_ < r.type_ || (l.type_ == r.type_ && l.position_ < r.position_);
}
inline bool operator==(const parameter_index& l, const parameter_index& r) noexcept {
return l.type_ == r.type_ && std::equal_to<>{}(l.name_, r.name_);
return l.type_ == r.type_ && l.position_ == r.position_;
}
}

View File

@@ -461,8 +461,10 @@ namespace meta_hpp::detail
struct parameter_state final {
parameter_index index;
std::string name{};
template < typename Parameter >
[[nodiscard]] static parameter_state_ptr make(std::string name);
[[nodiscard]] static parameter_state_ptr make(std::size_t position);
};
struct scope_state final {

View File

@@ -12,9 +12,9 @@
namespace meta_hpp::detail
{
template < typename Parameter >
inline parameter_state_ptr parameter_state::make(std::string name) {
inline parameter_state_ptr parameter_state::make(std::size_t position) {
return std::make_shared<parameter_state>(parameter_state{
.index{parameter_index::make<Parameter>(std::move(name))},
.index{parameter_index::make<Parameter>(position)},
});
}
}
@@ -41,7 +41,11 @@ namespace meta_hpp
return state_->index.get_type();
}
inline std::size_t parameter::get_position() const noexcept {
return state_->index.get_position();
}
inline const std::string& parameter::get_name() const noexcept {
return state_->index.get_name();
return state_->name;
}
}